#7396: [C]請問梅森質數該怎麼提升執行效率


a63138117 (Sam)

學校 : 清雲科技大學
編號 : 30447
來源 : [111.243.187.132]
最後登入時間 :
2013-04-01 00:55:53
. Unfinished! | From: [220.137.209.176] | 發表日期 : 2013-01-15 18:40

梅森質數的定義: 當一個數為質數且該質數等於2^n-1(n為任意整數) 的結果,就稱梅森質數 

以下是我寫的程式碼:

#include <stdio.h>

#include <stdlib.h>

int Mersenne();

int main()

{

    int n,i;

    scanf("%d",&n);

    printf("前 %d 個梅森質數:",n);

    for(i=1;i<=n;i++)

        printf("%d  ",Mersenne());

    printf("\n");

    system("pause");

    return 0;

}

 

int Mersenne()

{

    int i,s=1,flag=0,sum=1;

    static int p=1;

    while(s)

    {

        p=p+2;

        if(p%10==3 || p%10==1 || p%10==7)  //不知道加上這個判斷能不能提升效率 

        {

            for(i=2;i*i<=p;i++) 

                if(p%i==0)

                    flag++;

            if(flag==0)

                for(i=1;sum-1<p;i++)

                    sum=sum*2;

            if((sum-1)==p)

                s--;

            flag=0;

            sum=1;

        }

    }

    return p;

}

 
目前測到前7個梅森質數還可以
第8個就要等好久
請問要怎麼修改才能讓程式效率更佳 
 
#7967: Re:[C]請問梅森質數該怎麼提升執行效率


jdh8 (硬邦邦)

學校 : 臺北醫學大學
編號 : 6332
來源 : [122.116.101.60]
最後登入時間 :
2019-11-14 01:20:34
. Unfinished! | From: [36.231.74.237] | 發表日期 : 2013-07-18 00:57

https://en.wikipedia.org/wiki/Lucas%E2%80%93Lehmer_primality_test

#include <stdint.h>
#include <stdio.h>

/* Return zero iff 2^p - 1 is prime. */
int LucasLehmer (int p)
{
    uint64_t s = 4;
    uint64_t M = (1L << p) - 1;
    int i;
    for (i=0; i < p-2; ++i)
        s = ((__uint128_t)s*s - 2) % M;
    return s;
}

int main (void)
{
    int p;
    for (p=0; p < 64; ++p) {
        if (LucasLehmer(p) == 0)
            printf("2^%d is prime.\n", p);
    }
    return 0;
}

 
ZeroJudge Forum