×

Loading...
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。

我真的这么有病吗?刚刚写了个程序找素数。你看看有什么问题。在我的一台机器上运行,2秒种都不到。2*3*5*7*11*13+1=30031 = 59*509

本文发表在 rolia.net 枫下论坛#include <stdio.h>
#include <math.h>
#include <stdlib.h>

unsigned long odd[10000];
unsigned long odd_num=0;
unsigned long max=4000;
unsigned long checkOdd (unsigned long n)
{
unsigned long m = (unsigned long)sqrt(n);
//printf("n=%d m=%d\n",n,m);
if ( n==3)
return 0;
for ( unsigned long i=1; i< odd_num;i++) {
if ( odd[i]> m)
return 0;
if ( n%odd[i] ==0 )
return odd[i];
}
for ( unsigned long i=odd[odd_num-1]+2; i<= m ;i+=2) //here odd_num>=2
{
if (n%i ==0)
return i;
}
return 0;
}

main()
{
odd[odd_num++]=2;
printf("pow :%d\n",pow(2,3) );
printf("odd :2\n");
for ( unsigned long i=3;i< max;i+=2) {
if ( checkOdd(i) == 0) {
odd[odd_num++]=i;
printf("odd :%d\n",i);
}
}
printf ( "find odd %d\n",odd_num);
unsigned long multi= 2;
for ( unsigned long i=1;i< odd_num; i++ ) {
multi *=odd[i];
unsigned long Pn = multi+1;
unsigned long find=checkOdd(Pn);
if ( find >0 )
{
printf("haha : Pn=%d Pn-1 =%d find %d\n",Pn,odd[i],find);
}
if ( Pn > 0x8000000)
break;
}
}更多精彩文章及讨论,请光临枫下论坛 rolia.net
Report

Replies, comments and Discussions:

  • 工作学习 / 专业知识杂谈 / 当年曹操煮酒论英雄, 本人只是一个普通人, 但原此贴能招来天下英雄.
    有没有做IT的高人, 平时有空时, 研究算法, 阅读THE ART OF COMPUTER PROGRAMMING, 或闲得无聊自己写OS的.
    本人中学时代很喜欢初等数论, 也想认识这方面的高手.
    • I'd like to write an OS, but it needs a lot of time and energy.
    • 我有兴趣,但我希望我有时间。
    • 我也想。不过不是高手
    • 书呆子,都到加拿大了,业余时间还不如做做硬件,如
      到HOME DEPOT买点铁皮,木板;再到旧车场下个发动机,咱钉个螺旋桨飞机开开!!
      • 再过两周休假, 我是准备给我女儿刷房了.
    • 既然喜欢初等数论,那就考你一个简单问题:怎么证明素数有无穷多个?:)
      • Euler 乘积公式 呵呵. 下面的一段话来吓唬吓唬你们
        If you could be the Devil and offer a mathematician to sell his soul for the proof of one theorem - what theorem would most mathematicians ask for? I think it would be the Riemann Hypothesis.

        - H. Montgomery
      • 证明方法应该有很多种, 我给出反证法.
        假设素数是有限的, 可以表示为, P1, P2, ... Pn, (2,3,5, 7,.. Pn), 让 Pn+1 =P1* P2*P3*...
        *Pn+1, 显然, Pn+1 mod Pi ( 1<=i<=n) 为1, 所以Pn+1 不能被Pi ( 1<=i<=n)整除. Pn+1为素数, 故假设不成立, 素数是无限的.
        • wait a minute.
        • 素数的定义是不能被别的素数整除吗?
          • 素数的定义是:只能被本身和1整除的数。
          • 想不到喜欢数学的IT人太不少.
            因为假设了素数有限, 只要找出一个不属于该集合的数也是素数, 就可以推翻这个假设, 自然数里, 除了1 外, 要么是素数, 要么是非素数, 非素数肯定可以被其中一个素数整除, 如果有一个数不能被假设所有的素数整除, 就不是非素数, 又不是1, 应该是素数.
            • 以后打工填表时爱好一栏中可以写上:初等数论。没准能当个super歪sir.
              • I don't understand why low IQ guy like you also work in IT industry, I am young and have decent job, I am working as IT consultant!
                • Why IT guys must have high IQ? Most useful math is only +1 for IT.
                • 千言万语化做一句话:‘哎,国人。。。’
        • Good. :)
          这是我所知道的唯一的也是最简单的方法。
        • 这个证明有缺陷。并没有证明Pn+1一定是素数。Pn+1 只是不能被Pi(1<=i<=n)整除,但是Pn 到Pn+1还有很大空间可能存在素数,Pn+1可能被它整除。但是这样一来,又找到一个大素数。所以素数无限。
          • 实际上一找就要找到两个。
          • 牛人, 证明过程中把假设也改了.
            • 什么假设被改了?
              • 多的我也不说了, 其实出题的人是高手.
                • 你不是要讨论吗。你的证法确实有问题。
            • 根据你的征法,假设目前只有2,3,5,7,9为素数。Pn+1=2*3*5*7*9+1=1891,1891 是素数吗?自己算吧。
              • oh 不对,9不是素数:-(
              • 我真的这么有病吗?刚刚写了个程序找素数。你看看有什么问题。在我的一台机器上运行,2秒种都不到。2*3*5*7*11*13+1=30031 = 59*509
                本文发表在 rolia.net 枫下论坛#include <stdio.h>
                #include <math.h>
                #include <stdlib.h>

                unsigned long odd[10000];
                unsigned long odd_num=0;
                unsigned long max=4000;
                unsigned long checkOdd (unsigned long n)
                {
                unsigned long m = (unsigned long)sqrt(n);
                //printf("n=%d m=%d\n",n,m);
                if ( n==3)
                return 0;
                for ( unsigned long i=1; i< odd_num;i++) {
                if ( odd[i]> m)
                return 0;
                if ( n%odd[i] ==0 )
                return odd[i];
                }
                for ( unsigned long i=odd[odd_num-1]+2; i<= m ;i+=2) //here odd_num>=2
                {
                if (n%i ==0)
                return i;
                }
                return 0;
                }

                main()
                {
                odd[odd_num++]=2;
                printf("pow :%d\n",pow(2,3) );
                printf("odd :2\n");
                for ( unsigned long i=3;i< max;i+=2) {
                if ( checkOdd(i) == 0) {
                odd[odd_num++]=i;
                printf("odd :%d\n",i);
                }
                }
                printf ( "find odd %d\n",odd_num);
                unsigned long multi= 2;
                for ( unsigned long i=1;i< odd_num; i++ ) {
                multi *=odd[i];
                unsigned long Pn = multi+1;
                unsigned long find=checkOdd(Pn);
                if ( find >0 )
                {
                printf("haha : Pn=%d Pn-1 =%d find %d\n",Pn,odd[i],find);
                }
                if ( Pn > 0x8000000)
                break;
                }
                }更多精彩文章及讨论,请光临枫下论坛 rolia.net
                • 佩服您不服输的精神, 你是不是先学的C++/JAVA, 再学的C,你的程序应该只能在C++编译器下才能通过?
                  • 我用C++是因为比C方便。你倒是说说谁输了。我学C时,咳,不说了。显得我是个老头。
                    • 你错了. 再看看证明, 是所有素数全乘上.
            • "假设素数是有限的, 可以表示为, P1, P2, ... Pn," 所以你说的"Pn 到Pn+1还有很大空间可能存在素数"不成立。
              • 彻底晕倒。
                • 先回去复习一下反证法吧。
                  • 大家共同学习:-)
        • 不好意思,早上再看一遍,我真错了。关键是假设P1.Pn是所有素数,Pn+1不能被所有素数除,所以也是素数。我的思路一直在根据现有最大素数集,总能保证找到一个更大素数。这说不定是另一种证法,不过我就不乱说了,干我的本职工作去吧:-(
    • 高手过招
    • 初中生就能证明的简单问题,也值得高人讨论半天
      • 哈哈