Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 구현하는 Newman-Shanks-Williams 소수 수열


Newman-Shanks-Williams(NSW) 수열은 1981년 모리스 뉴먼(Morris Newman), 대니얼 섕크스(Daniel Shanks), 휴 윌리엄스(Hugh C. Williams)가 연구하면서 소개된 수열로, 그중 소수에 해당하는 항들을 NSW 소수라고 부릅니다. 이 수열은 다음과 같습니다.

1, 1, 3, 7, 17, 41...

이 수열을 일반화하면 아래와 같은 점화식으로 표현할 수 있습니다.

a0=1
a1=1
an=2*a(n-1)+a(n-2)

알고리즘

  • 구하고자 하는 항의 번호 n을 초기화합니다.
  • 수열의 첫 두 항인 1과 1로 초기값을 설정합니다.
  • n번째 항까지 반복하는 루프를 작성합니다.
    • 이전 두 항을 이용해 다음 항을 계산합니다.
    • 이전 두 항의 값을 최신 값으로 갱신합니다.
  • 마지막으로 계산된 값을 반환합니다.

구현

다음은 위에서 설명한 알고리즘을 C++로 구현한 코드입니다.

#include <bits/stdc++.h>
using namespace std;
int getNthTerm(int n) {
   if(n == 0 || n == 1) {
      return 1;
   }
   int a = 1, b = 1;
   for(int i = 3; i <= n; ++i) {
      int c = 2 * b + a;
      a = b;
      b = c;
   }
   return b;
}
int main() {
   int n = 5;
   cout << getNthTerm(n) << endl;
   return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

17

위 예제에서는 n=5일 때의 값을 구했으며, 수열의 다섯 번째 항인 17이 출력되는 것을 확인할 수 있습니다. 이 알고리즘은 각 항을 한 번씩만 계산하므로 시간 복잡도는 O(n)이며, 공간 복잡도는 O(1)로 매우 효율적입니다.