더북(TheBook)

몇 가지 입력을 예로 프로그램을 추적해보면 프로그램이 어떻게 돌아가는지 잘 알 수 있다. 모든 입력에 대해 이 프로그램이 원하는 대로 작동하는지 확신이 서려면 각각의 루프가 어떤 작업을 수행하는지 잘 생각해봐야 한다. 내부 while 루프는 nfactor로 나누고 출력한다. 이 프로그램은 외부 while 루프가 반복되는 초기에 n2factor - 1로는 인수분해되지 않는다는 명제가 유지된다는 것을 알아야 이해할 수 있다. 따라서 factor가 소수가 아니면 n을 나눌 수 없다. factor가 소수이면 while 루프는 factor로 나누는 시도를 해보며, 이때도 명제는 유지된다. nn의 제곱근이나 제곱근보다 1만큼 작은 수로 인수분해되므로 factor * factorn보다 크면 루프를 중단한다.

조금 더 원시적으로 구현해 외부 루프의 종료 조건을 (factor < n)이라고 했다면 아무리 빠른 최신 컴퓨터라 해도 인수분해를 시도할 엄청난 횟수 때문에 실행 시간이 오래 걸릴 것이다. [연습문제 1.3.26]은 프로그램을 이와 같이 변경해 어떤 결과가 나오는지 실험해보도록 한다. 초당 수십억 번의 연산을 수행할 수 있는 컴퓨터에서 종료 조건이 (factor*factor <= n)인 경우 109번 나누는 연산은 몇 초면 끝나지만, 종료 조건이 (factor < n)인 경우 1018번 나누는 연산은 상당히 오래 걸린다. 루프를 이용하면 어려운 문제도 해결할 수 있지만, 간단한 프로그램도 실행 시간이 상당히 길어질 수 있으므로, 늘 성능 문제를 염두에 두어야 한다.

암호화와 같은 최신 분야에서는 아주 큰 수(수백이나 수천 자리의 정수)를 소인수 분해해야 하는 것이 핵심이다. 전문가들이 빠른 컴퓨터를 사용하더라도 아직까지 이런 계산은 불가능에 가까울 정도로 어렵다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.