您的位置:首页 > 其它

为了记住一个定理

2004-06-07 18:01 260 查看
有一道题:
有一个猜想:如果大于等于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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐