경제적, 정치적 결정을 내릴 때 시뮬레이션을 참고하는 경향은 오늘 날 점점 강화되고 있습니다. 현실에서 일어나는 과정을 컴퓨터에서 계산 하는 것인데 그 이유는 2가지가 있습니다.

 

 

첫째, 아직 일어난 적 없는 과정을 연구할 때 시뮬레이션이 쓰입니다. 날씨 예측이나 향후 100년 동안의 세계 기후 시뮬레이션들 일어나지 않은 과정들에 활용이 됩니다.

 

둘째, 현실에서 실험이 너무 번거롭거나 비용이 많이 들 때 시뮬레이션이 쓰입니다. 예컨데 현실에서자동차 충돌 실험을 하려면 매번 비싼 차체를 고철로 만들어야 합니다. 충돌 과정 전체를 컴퓨터에서 계산할 수 있다면 효율적으로 일을 해결할 수 있습니다.

 

하지만 위의 2가지 이유말고 의문점이 생깁니다. "여기서 말하는 시뮬레이션은 현실과 얼마나 유사할까?" 라는 질문을 할 수 있습니다. 왜냐하면 시뮬레이션은 엄연치 현실과는 오차범위가 있고 언제나 예외,변수등이 일어날 수 있습니다.

 

현실에서 마주치는 과정을 계산하려며 물리량들의 상호관계를 기술하는 '미분방정식'을 풀어야 합니다. 그런데 대개의 미분방정식 풀이는 완전한 해를 구하는 방식으로 이루어지지 않습니다. 대신에 사람들은 문제를 모든 점에서 고찰하지 않고 띄엄띄엄 떨어진 점들로 구성된 격자에서만 고찰함으로써 이산화 (discretize)합니다. 예를 들어 온도, 풍속 등을 모든 지점에서 계산하는 대신에 전체 지역을 1제곱 킬로미터 면적의 구역으로 나누고 각 구역에서의 값을 계산하는 것으로 만족해야 합니다.

 

일반적으로 그 격자가 촘촘할수록 미분방정식의 해는 현실과 더 유사하게 됩니다. 그러나 격자가 촘촘해지면 그만큼 계산에 공이 더 많이듭니다. 이를테면 3차원 공간에서 일어나는 한 현상을 시뮬레이션하는데, 격자의 눈의 한 변을 반으로 줄이면 계산에서 고려할 점들이 8배로 늘어나므로 계산 시간도 8배로 늘어나게 됩니다. 이 때문에 날씨 예측에서 격자를 점점 더 촘촘하게 만들다보면 내일 날씨의 계산 결과가 모래에야 나오는 상황이 발생할 수도 있습니다.

 

 

 

때로는 촘촘한 격자가 필요하지 않습니다. 예컨대 기체나 액체의 흐름을 고찰할 때는 그 흐름이 층류(laminar flow)여서 뒤엉킴 없이 매끄럽게 흐르기만 한다면 비교적 성긴 격자로도 좋은 계산 결과를얻을 수 있습니다. 반면에 난류(turbulent flow)에서는 아주 작은 소용돌이 하나도 흐름 전체에 중요한 영향을 미치므로 더 촘촘한 격자가 필요합니다.

 

이른바 '다중격자 알고리즘(multigrid algorithm)'의 원리는 1970년대 후반 이래로 개발되었습니다. 이 알고리즘은 고정된 격자를 사용하는 대신에 풀어야 할 미분 방정식을 고찰하여 어느 구역에서는 격자를 더 촘촘하게 만들어야 하고 어느 구역에서는 비교적 성긴 격자로도 충분한지 판단합니다. 이 알고리즘의 최대 장점은 계산의 복잡성을 줄여서 훨씬 더 빠른 계산을 가능케 하는 것에 있습니다.

 

다중격자 알고리즘은 최신 컴퓨터들의 계산 능력 향상에도 불구하고 그 능력을 아껴 쓰기 위한 노력이 앞으로도 늘 필요할 것임을 보여주는 한 사례입니다. 오늘날 사람들은 컴퓨터의 놀라운 성능을 대수롭지 않게 여기는 경우가 많습니다. 컴퓨터 내부에서 작동하는 알고리즘의 효율성을 높이기 위해서 수많은 노력과 인력이 들어갑니다.

 

 

#다중격자알고리즘 #multigridalgorithm

 

 

 

 

 

 

 

일찍이 기원전 300년경에 그리스 수학자 유클리드(Euclid)가 제시한 이 알고리즘은 두 개의 수의 최대 공약수를 구하는 절차입니다. 조금 더 구체적으로 표현하자면 유클리드 알고리즘은 반복 절차입니다. 이 말은 즉, 결과에 도달할 때까지 동일한 수학적 연산이 계속 반복되는 것입니다.

 


 

예제로 a=1513과 b=357의 최대공약수를 구해보겠습니다. 먼저, 큰 수를 작은 수로 나눌 때 나오는 나머지 r을 알아내야 합니다. 이 예제에서는 r은 85입니다.

 

 

 

1513= 4 * 357 + 85

이번에는 작은 수 b를 r₁으로 나눌 때 나오는 r₂를 구합니다.

357 = 4 * 85 + 17

이러한 작업을 계속 반복하게 됩니다. 항상 작은 수(이 단계에서는 r₁)를 나머지 (r₂)로 나누는데, 나눗셈의 나머지가 0이 될 때까지 이 작업을 반복하게 됩니다. 이 예에서는 벌써 다음 단계에서 나머지가 0을 가지게 됩니다.

85 = 5 * 17 + 0

17은 앞서 등장한 모든 나머지들의 약수이며 a와 b의 약수이기도 합니다. 정확히 말하자면 17은 a와 b의 최대공약수입니다.

유클리드 알고리즘은 두 수를 우선 소인수분해한 다음에 그 소인수들을 비교하는 방법보다 더 신속하고 깔끔하게 최대 공약수 구하기 문제를 해결할 수 있습니다. 게다가 유클리드 알고리즘은 정수가 아닌 수에도 적용할 수 있습니다. 임의의 수들의 "공통 단위"를 유클리드 알고리즘으로 구할 수 있습니다. 하지만 이 알고리즘이 항상 유한한 개수의 단계를 거쳐 최종 결과에 도달하는 것은 아닙니다. 1과 √2에 유클리드 알고리즘을 적용하면, 나머지들이 점점 더 작아지기는 하지만

나눗셈의 나머지가 0으로 되는 일은 끝내 일어나지 않을 것입니다. √2처럼 통약불가능한 수들이 존재한다는 깨달음은 온 세계를 자연수들의 비율로 기술할 수 있다는 피타고라스 추종자들의 세계관을 무너뜨렸습니다.

 


 

 

※ 오늘은 '유클리드 알고리즘'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 컴퓨터 공학 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 알고리즘 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

 

+ Recent posts