| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2339 人关注过本帖
标题:用计算机编程的方法证明2^67-1不是素数
只看楼主 加入收藏
powerfrank
Rank: 2
等 级:论坛游民
帖 子:31
专家分:37
注 册:2018-4-25
结帖率:80%
收藏
已结贴  问题点数:3 回复次数:7 
用计算机编程的方法证明2^67-1不是素数
用计算机编程的方法证明2^67-1不是素数

证明2的67次方减1不是素数 这道题昨晚想了一整晚,没想出好的思路。哪位大神点拨下。
搜索更多相关主题的帖子: 计算机 编程 方法 素数 思路 
2018-12-13 11:09
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:396
专家分:2640
注 册:2018-3-30
收藏
得分:1 
插个眼

saber,别哭.
2018-12-13 12:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:1 
写个大数除法的函数
2018-12-13 12:41
powerfrank
Rank: 2
等 级:论坛游民
帖 子:31
专家分:37
注 册:2018-4-25
收藏
得分:0 
回复 3楼 rjsp
2的67次方的值位数有21位,如果2^67-1不是素数,分解为两数相乘,其中较小值的最大的可能能达到10位,较大值的最小的可能能达到11位。用除法得到的结果不会有数据溢出?
我是倾向于用加法然后再比较,但是考虑到循环一次就要加10000 00000次,我有点头大。
2018-12-13 16:49
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:396
专家分:2640
注 册:2018-3-30
收藏
得分:0 
2^67 - 1 = 147573952589676412927 = 761838257287 × 193707721
大数循环遍历1.9亿次肯定可以弄出来的,计算机又不会累,但是没啥技术含量啊.
数学方法嘛...梅森素数数学界大佬也是用很多年才证明这个不是素数,。

saber,别哭.
2018-12-13 17:42
wlxy_wang
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:77
专家分:303
注 册:2018-11-2
收藏
得分:1 
这个问题的核心就是你怎么把2^67-1精确的表示出来,并能进行数学运算,其他的都很简单了
https://blog.
这是个大数算法,看看吧

[此贴子已经被作者于2018-12-14 16:03编辑过]

2018-12-14 15:53
花花花花花
Rank: 1
等 级:新手上路
帖 子:5
专家分:1
注 册:2018-12-11
收藏
得分:1 
想问一下怎么关注帖子啊??
2018-12-15 20:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用powerfrank在2018-12-13 16:49:59的发言:

2的67次方的值位数有21位,如果2^67-1不是素数,分解为两数相乘,其中较小值的最大的可能能达到10位,较大值的最小的可能能达到11位。用除法得到的结果不会有数据溢出?
我是倾向于用加法然后再比较,但是考虑到循环一次就要加10000 00000次,我有点头大。

效率不高,需要六秒多出结果
程序代码:
#include <stdio.h>

// 余数 mydiv( 被除数, 除数, 商 )
unsigned long long mydiv( const unsigned numerator[], unsigned long long denominator, unsigned quotient[] )
{
    unsigned long long remainder = 0;

    for( size_t i=0; i!=3; ++i )
    {
        remainder = remainder*1000000000 + numerator[i];
        quotient[i] = (unsigned)(remainder/denominator);
        remainder %= denominator;
    }

    return remainder;
}

int mycompare( const unsigned a[], unsigned long long b )
{
    unsigned b_[] = { (unsigned)(b/1000000000000000000), (unsigned)(b%1000000000000000000/1000000000), (unsigned)(b%1000000000) };
    for( size_t i=0; i!=3; ++i )
    {
        if( a[i] < b_[i] ) return -1;
        if( a[i] > b_[i] ) return +1;
    }
    return 0;
}

void myprint( const unsigned a[] )
{
    if( a[0] != 0 )
        printf( "%u%09u%09u", a[0], a[1], a[2] );
    else if( a[1] != 0 )
        printf( "%u%09u", a[1], a[2] );
    else
        printf( "%u", a[2] );
}

int main( void )
{
    const unsigned n[] = { 147, 573952589, 676412927 }; // 2^67-1

    for( unsigned long long denom=3; ; denom+=2 )
    {
        unsigned quotient[3];
        unsigned long long remainder = mydiv( n, denom, quotient );

        if( remainder == 0 )
        {
            printf( "%llu * ", denom );
            myprint( quotient );
            putchar( '\n' );
            break;
        }

        if( mycompare(quotient,denom) < 0 )
        {
            puts( "it is a prime number." );
            break;
        }
    }
}

输出
193707721 * 761838257287




2018-12-17 13:20
快速回复:用计算机编程的方法证明2^67-1不是素数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025044 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved