一笑聊斋

书山无路劈荆棘,学海茫茫浮木舟!皇天厚赐我才庸,唯有搏命与天挣。不尽人世坎坷路,岂有繁华幸福驻?满怀壮志闯江湖,不立威名不归梓。 ——夜读自励 SmileOnce于2004年元月4日夜

导航

为了记住一个定理

有一道题:
有一个猜想:如果大于等于3正整数P,满足2的P-1次方除以P的余数是1,则P是素数。简单的表示就是: 如果 2^(P-1) MOD P=1,则P为素数。但可惜,这个猜想其实是不正确的。下面请你编写一个计算机程序,举出自然数中的第一个反例。

有一个解法:
// write by love2000
BOOL IsSuSu(int p)
{

    for(int i=2; i<p/2; i++)
        if(0 == (p%i))
            return FALSE;

        return TRUE;
}

void CTestDlg::OnButton1()
{
    CString aa;
    int p =1;
    while(1)
    {
        p = p +2;
        unsigned long sum=1;
        for(int i=p; i>1; i--)
        {
            sum = (sum*2)%p;
            if(sum == 0)
                break;
        }
        if((sum==1) && (!IsSuSu(p)))
        {
            aa.Format("success p is %d", p);
            MessageBox(aa);
            return;
        }
    }
    
}


其中有一句我不懂:
for(int i=p; i>1; i--)
        {
            sum = (sum*2)%p;    //<-- 问题1)这句是什么意思?
            if(sum == 0) break;   //<-- 问题2)为什么要加上这句?
        }


于是有了以下解答:
问题1)
回复人: 杨老师 2004-6-7 13:36:47
n^p%k == (n%k)^p
证明:n^p%k = (a*k+t)^p%k = t^p%k,因为(a*k+t)^p的展开,除最后一项,前面都是K的倍数

问题2)
回复人: 阿荣 2004-6-7 13:35:42 (得分:5
模p乘2,如果为0,再乘还有意义么?

还有一些是我知道的:

1.其实验证素数不需要验证到p/2,到sqrt(p)就可以了。
// for(int i=2; i<p/2; i++)
杨老师给出的证明:若p=a*b,而a>sqrt(p),因为同理,b>sqrt(p)因此,a*b>p,反证出现矛盾:)


2.还有一种叫做“爱沙托散筛法”的解法,效率很高,但空间消耗比较大。
#include <iostream>
#include <stdlib.h>

static const int N = 1000;
int main(int argc, char *argv[])
{
  int i, a[N];
  for (i=2; i<N; i++) a[i] = 1;
  for (i=2; i<N; i++)
    if (a[i])
        for(int j=i; j*i<N; j++) a[i*j] = 0;
  for (i=2; i<N; i++)
    if (a[i]) cout << " " << i;
  cout << endl;
  system("PAUSE"); 
  return 0;
}

posted on 2004-06-07 18:01  乾坤一笑  阅读(525)  评论(0)    收藏  举报