无心人 发表于 2008-2-13 17:21:12

估计下找到10^100以上的一个四生素数的工作量

一个比较好的论坛话题从10^100开始
无限搜索下去
使用210k + * 10 + 形式
估计下,多长时间能搜索到一个四生素数

四生素数的分布概率有个公式,不记得在什么地方看到了
按照(1/100/ln10)^4算, 是1/28.11亿
搜索的速度是210/3 = 70

大概应该在1/28亿 * 70 = 1/4000万

计算一个100位数字是素数的时间是 < 1/200, 每组4个数字平均计算次数是< 1.5
则应该平均在4000万 * 1.5 / 200 = 6000 0000 / 200 = 3000000秒得到第一个结果

我计算的对么?

mathe 发表于 2008-2-13 20:50:46

四生素数的定义:如果p,p+2,p+6,p+8都是素数,那么它们是四生素数。(通过google查到的)
计算没有什么错误,不过算法不是很好。
这个题目可以作为擂台赛。要求
对于一个输入的100位整数,要求在五分钟内用计算机找到不小于这个数的最小一组四生素数

无心人 发表于 2008-2-14 08:00:50

你忒狠了啊

五分钟
可能么?

我计算过,以p1p2p3..pi*10*k + 的算法
只需要计算1/pi的数字
但是,差不容易计算

无心人 发表于 2008-2-14 08:14:55

证明一个100位十进制的数字是素数,使用概率算法
时间绝对是大于1/2000秒的啊

就是说如果找到一个可能的结果,至少需1/500秒证明

无心人 发表于 2008-2-14 08:39:02

http://primes.utm.edu/gifs/HardyLittlewood4.gif
上面是四生素数的分布估计

gxqcn 发表于 2008-2-14 09:50:13

我写的程序

//////////////////////////////////////////////////////////////////////////
//
// 目的:搜索 10^r 后的四生素数
// 设计:郭先强 ( gxqcn@163.com; HugeCalc@Gmail.com )
// 日期:2008-02-14
// 备注:HugeCalc 暂未提供成片素数导出接口,否则会更快点:)
//
// Web: http://www.emath.ac.cn/
// BBS: http://bbs.emath.ac.cn/
//
//////////////////////////////////////////////////////////////////////////

// Project -> Setting -> C/C++ -> Code Generation --> Use run-time library:
//      Win32 Debug:    Debug Multithreaded DLL
//      Win32 Release:Multithreaded DLL

#include < iostream.h >
#include < fstream.h >

#include < HugeCalc.h > // 公共接口
#include < HugeInt.h >// 10进制系统

#pragma message( "automatic link to .../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
#pragma comment( lib, "HugeCalc.lib" )

int main(int argc, char* argv[])
{
    cout << "Call " << HugeCalc::GetVer() << endl << endl;

    if ( HC_LICENSE_NONE == HugeCalc::GetLicenseLevel() )
    {
      cout << "\r\n警告:您未通过 HugeCalc.dll 的许可认证!\r\n" \
            << "\r\n解决方案可选下列方案之一:" \
            << "\r\n    一、请将本程序移动到“/CopyrightByGuoXianqiang/[../]”目录下运行;" \
            << "\r\n    二、或请在 HugeCalc.chm 中进行注册(一劳永逸)。" \
            << endl;
    }
    else
    {
      CHugeInt p( 1 ), p2, p6, p8, d;
      UINT32 r, numb = 0, numb_max, delta;

      cout << "*** 搜索 10^r 后的四生素数 ***"<< endl;

      cout << "请输入 r = ";
      cin >> r;
      cout << endl;

      cout << "请设定搜索组数:";
      cin >> numb_max;
      cout << endl;

      if ( 0 == numb_max )
      {
            ++numb_max;
      }

      HugeCalc::EnableTimer();
      HugeCalc::ResetTimer();

      p.DecLShift( r );
      p.NextPrime( p );

      for ( ; ; )
      {
            p2.NextPrime( p );

            delta = (UINT32)(( d = p2 ) -= p );
            if ( 2 == delta )
            {
                p6.NextPrime( p2 );
            }
            else
            {
                p.Swap( p2 );
                continue;
            }

            delta = (UINT32)(( d = p6 ) -= p );
            if ( 6 == delta )
            {
                p8.NextPrime( p6 );
            }
            else
            {
                p.Swap(( 2 == delta ) ? p2 : p6 );
                continue;
            }

            delta = (UINT32)(( d = p8 ) -= p );
            if ( 8 == delta )
            {
                cout << "No." << ++numb << "\t" << HugeCalc::GetTimerStr() << endl;
                cout << "p = " << (LPCTSTR)p << endl;

                if ( numb_max == numb )
                {
                  cout << endl;
                  system( "pause" );
                  break;
                }
                else if ( 0 == ( numb & 15 ))
                {
                  HugeCalc::EnableTimer( FALSE );
                  cout << endl;
                  system( "pause" );
                  HugeCalc::EnableTimer();
                }
            }

            p.Swap( p8 );
      }
    }

    return 0;
}含源代码及编译好的程序压缩包:

mathe 发表于 2008-2-14 09:54:27

呵呵,性能肯定不行:)

gxqcn 发表于 2008-2-14 10:13:04

确实。
对于小点的 r,可以迅速得到解,权做一个数学小工具吧,方便对此有兴趣的朋友。:)

mathe 发表于 2008-2-14 11:03:32

我给一个Reference Code,但是好像有点问题,不知道什么地方卡住了.
但是不知道为什么,我的机器上VC不能够调试程序,怎么设置都说没有调试信息:L
所以没办法找出原因,郭老大可以帮忙看一看:
**** Hidden Message *****

gxqcn 发表于 2008-2-14 11:34:00

问题出在“#define SET_MASK(x)(mask[(x)>>5]|=1<<((x)&31))”宏定义上,其中的 x 并未被修改,
致使如下代码(也许是这里的问题)进入死循环:            int h;
            for(h=s;h<RANGE;s+=p){
                SET_MASK(h);///Filter hugeStart+h*30
            }非常佩服你将 HugeCalc 运用得如此熟练。

一点建议:         if((hugeStart-4).IsPrime()&&
                (hugeStart-2).IsPrime()&&
                (hugeStart+2).IsPrime()&&
                (hugeStart+4).IsPrime()){修改成:            integer hugeTmp( hugeStart );
            if((hugeTmp-=4).IsPrime()&&
                (hugeTmp+=2).IsPrime()&&
                (hugeTmp+=4).IsPrime()&&
                (hugeTmp+=2).IsPrime()){可以减少一些临时变量的构造与析构。
页: [1] 2 3 4 5 6 7
查看完整版本: 估计下找到10^100以上的一个四生素数的工作量