연구는 소수 노트

정의

자연수 1 일까지 자체에 추가 나누어 어떤 자연수가 될 수없는 경우,이 숫자는 소수 (알려진 소수)이라고합니다.
자연수의 집합을 통해, 작은 소수의 분포가 희박한, 충분히 큰 자연수 N에 대해, N은 N / LNN 번호 LNN 약 소수 당 즉 번호에 대한보다 더 소수이다.

소수의 결정

시험 부문

   양수가 합성 수 인 경우, N T, 2 $ \ 당량 $ T $ \로 나눌 수있다 당량은 $ N. 그것은 조금을 입증했다.
나눌 수없는 경우 위의 제안에 따르면, 우리는 모든 정수 사이에 2 ~ $의 \의 SQRT {N} $를 스캔해야, N은 순차적으로 그들이 할 수있는 여부를 확인로 나누어, 다음, N은 소수, 또는 합성 수. 시간 복잡도는 O ($의 \의 SQRT {N}이다 $).

void primes(int n)
{
    memset(v,0,sizeof(v));
    for(int i=2;i<=n;i++)
    {
        if(v[i]) continue;
        cout<<i<<endl;
        for (int j = i; j < n/i; j++)
            v[i*j]=1;
    }
}

도 있습니다 밀러 라빈스의 결정 방법은 확률 적 알고리즘이 더 효율적이다, 나는 학교에 갈 수 있습니다.

소수의 심사

여기에 소수에 대한 심사의 몇 가지 방법이 있습니다.

에라 토 스테 네스 筛 法

임의의 정수 X의 배수는 확실히 소수되지 않습니다.
숫자를 스캔이 표지되지 않은 경우에 우리는 각각 큰 후 여러 스캔 횟수이 번호 작은 스캔 2로부터 시작하는 마크가 합성 수이고, 그것은 2 ~ N-1 일 수 없다 나누어, 그것은 소수입니다.
때문에 우리는 $로부터 x ^ 2 $이 배수의 시작을 표시, 최적화 할 수 있습니다 덜 $보다 X ^ 2 $의 수는 적은 수의 이상 표시되었습니다.

void primes(int n)
{
    memset(v,0,sizeof(v));
    for(int i=2;i<=n;i++)
    {
        if(v[i]) continue;
        cout<<i<<endl;
        for (int j = i; j < n/i; j++)
            v[i*j]=1;
    }
}

에펜 도르프 체 시간 복잡도는 O (NloglogN)이다.

선형 체

선형 체 방법은 에펜 도르프 체 체보다 더 나은 방법입니다. 그것은 "통해 큰 소인수 축적 작은 마크의 수를 더 압축되도록 함께, 효율을 향상시키고, 각각의 합성 수는"표지. 어레이 당 V 녹화 품질 팩터는 다음과 같이 유지 V의 최소 수를 제공 :

  1. 순차 2 사이의 각각의 번호를 I 고려 ~ N.
  2. V는 [I] = 1, I 설명 소수 인 경우, 그것을 저장한다.
  3. 스캔 [I]를 각각 소수 p를 들어, 그래서 V [i가 $ \ 시간 $ P 브이 이하인 ] = P. 즉 품질 계수 P는에 따라 발생 재 난. P는 $의 \의 당량의 $의 V 때문에 [I ], 그것은 가장 작은 소인수 p를 복합 번호 P는 $의 \의 $ 번 난의입니다.
    O의 시간 복잡도 (N).
void primes(int n)
{
    memset(v,0,sizeof(v)); //最小质因子
    m=0; //质数数量
    for (int i = 2; i <= n; i++)
    {
        if (v[i]==0)
        {
            v[i]=i;
            prime[++m]=i;  //i是质数
        }
        for (int j = 0; j <= m; j++)
        {
            if(prime[j]>v[i]||prime[j]>n/i) break;  //质数的范围不能超出v[i]和n
            v[i*prime[j]]=prime[j];
        }
    }
}

의 소인수 분해

산술의 기본 정리

모든 양의 정수 1보다 큰이 제품은 독특한 소수의 유한 수로 분해 될 수있는, 같이 쓸 수있다 :

N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}

그중 $ C_I $는 양의 정수이고, $ p_i의 $는 소수, 만족입니다 :

p_1<p_2<...<p_m

시험 부문

이 방법은 소수 "시험 부문"과의 결정 결합 "에펜 도르프 체."
스캔 2 ~ $의 \의 SQRT는 {N}의 (d)의 각 정수를 $ D 곱셈과 나눗셈이 모든 요인 거라고 제거 N, N, 될 수 있다면 제거 D의 누적 수있다.
각 요소는이 요소를 스캔 처음이므로 시간 복잡도가 O (N) 인도록 완전히 제거 하였다.

void divide(int n)
{
    m=0;
    for (int i = 2; i <= sqrt(n); i++)
    {
        if (n%i==0)  //这里i一定是质数,因为后面搜到合数时,早已被前面的质数除掉了
        {
            p[++m]=i,c[m]=0;
            while(n%i==0)
            {
                n/=i;
                c[m]++;
            }
        }
    }
    if (n>1)  //n是质数
    {
        p[++m]=n;
        c[m]=1;
    }
}

는 "도 있습니다 폴라드의의 Rho "알고리즘, 경쟁 부문과 효율적인은.

추천

출처www.cnblogs.com/zxj-hans/p/11261148.html