为了记住一个定理
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)
n^p%k == (n%k)^p
证明:n^p%k = (a*k+t)^p%k = t^p%k,因为(a*k+t)^p的展开,除最后一项,前面都是K的倍数
问题2)
模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;
}
有一个猜想:如果大于等于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 = (a*k+t)^p%k = t^p%k,因为(a*k+t)^p的展开,除最后一项,前面都是K的倍数
问题2)
回复人: 阿荣 | 2004-6-7 13:35:42 (得分:5) |
还有一些是我知道的:
// 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;
}
相关文章推荐
- 为了一个 const 折腾了半天
- django为了解决同一个项目不同app下Templates冲突的解决方法
- Android学习笔记(19)————实现一个记住密码的Android登陆界面
- iOS 取出RGB设置UIColor的RGB值, 有时为了跟其他控件一个主题色但是想改变一下透明度
- 你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。
- 为了响应大家对IDEA 12的支持,特奉上一个解决中文字体问题的好东东
- R编写一个数论中的简单定理
- 一个常用定理表 - [武林秘籍…
- 编写一个程序,一行行地读取输入行,直至到达文件尾。算出每行输入行的长度,然后把最长的那行打印出来。为了简单起见,你可以假定所有的输入行均不超过1000个字符。
- 初学shell,为了练习sed,写了个简单的批量修改文件名的脚本,后来执行时发现系统竟然自带有一个rename命令,顺便也记下了
- 现在为了让程序兼容vista,我们需要给程序加上一个manifest文件,可是有时候vc6它就会弹出Resource Compiler Error RC2170 的错误,可能是vc6一个bug,我个人对vc6还是很喜欢的,不过经常会有编译死掉或出错的问题,
- 居然为了一个无纺布口袋对我发飙
- 为了找一个好工作,得学习以下内容
- 这些墙是为了给我们一个机会,去证明我们究竟有多想要得到那些东西。
- 模仿了一个夸张的商品倒计时效果,设计的精简当然也很丑,只是为了检测自己说明问题
- 为了一个男人而失眠
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- 天津一个17岁男孩为了买一个笔记本竟然把肾卖了
- 为了回答一个小学生问题
- 自己为了理解Functor写的一个例子