곱셈 없이 첫 N개의 자연수 제곱 구하기

곱셈 없이 첫 N개의 자연수 제곱 구하기

초록

본 논문은 곱셈 연산자를 사용하지 않고 덧셈만으로 1부터 N까지의 자연수 제곱을 계산하는 알고리즘을 제시한다. 연속적인 차이값(홀수)을 누적합하는 방식으로 각 제곱을 얻으며, 이를 통해 제곱들의 합도 손쉽게 구할 수 있다. 시간 복잡도는 O(N)이며, 곱셈보다 빠른 연산인 덧셈을 활용함으로써 특정 프로세서 환경에서 성능 향상을 기대한다.

상세 분석

제시된 알고리즘은 수학적 사실인 “연속된 자연수 제곱의 차이는 연속된 홀수”에 기반한다. 구체적으로 k² – (k‑1)² = 2k‑1이며, 이는 k번째 제곱을 이전 제곱에 현재 홀수를 더해 구할 수 있음을 의미한다. 따라서 초기값 1² = 1에서 시작해, 차례로 3,5,7,…을 누적하면 2²,3²,…,N²를 순차적으로 얻는다. 이 과정은 순수 덧셈 연산만을 사용하므로 곱셈 명령어가 상대적으로 비용이 높은 임베디드 시스템이나 저전력 마이크로컨트롤러에서 유리하다.

알고리즘의 시간 복잡도는 입력 N에 대해 선형 O(N)이며, 공간 복잡도는 현재 제곱값과 누적합을 저장하는 몇 개의 정수 변수만 필요해 O(1)이다. 기존의 “i*i” 형태로 제곱을 계산하는 방법은 각 반복마다 곱셈 연산을 수행하므로, 곱셈 연산이 여러 클록 사이클을 소모하는 아키텍처에서는 실제 실행 시간이 더 길어질 수 있다. 특히, 현대 CPU는 곱셈을 최적화했지만, 일부 특수 목적 프로세서나 FPGA 구현에서는 덧셈이 훨씬 저렴하게 구현된다.

또한, 제곱들의 합 Σk² (k=1..N)은 각 제곱을 구하면서 동시에 누적합을 업데이트함으로써 별도의 O(N) 루프 없이 O(N) 시간에 구할 수 있다. 이는 메모리 접근 횟수를 최소화하고, 파이프라인 효율성을 높이는 효과가 있다.

하지만 알고리즘은 정수 오버플로우 위험을 내포한다. N이 커질수록 누적된 제곱값과 합이 급격히 증가하므로, 64비트 정수 혹은 임의 정밀도 라이브러리를 사용해야 한다. 또한, 곱셈 연산이 하드웨어적으로 최적화된 환경에서는 이 알고리즘이 반드시 더 빠르다고 단정하기 어렵다. 따라서 실제 적용 전에는 목표 플랫폼의 명령어 사이클 비용을 프로파일링하여 선택해야 한다.

요약하면, 이 알고리즘은 수학적 성질을 활용해 연산 종류를 제한함으로써 특정 환경에서 성능을 개선할 수 있는 실용적인 대안이며, 구현이 간단하고 메모리 사용이 최소화된 점이 큰 장점이다.