QQ342139996【期望有更多的伙伴来一起探索计算机的世界】
一个偶然的机会我开始想将自己的一些工作的经验总结下来,但是没有一个好的地方来发泄,就找了一个比较难的课题来搞一下。
计算一个世界上最大的素数,首先我们需要知道的是,目前最大的素数是多少,我们咋能超越他,目前干了一个月了,感觉超越他基本上不靠谱。
不过,这也是我的一个个人经历,希望记录下来,就算是一个失败的作品记录吧,感觉总有一些东西是有意义的。
目标:找到世界上最大的素数
需要做的工作
1、目前的最大的素数是多少
百度一下就知道了,2016年1月发现的,p=2^74207281-1
2、他们咋搞的
也是百度一下,搞这个的,都是和数学有很大的关系,但是感觉他们猜测的成分很高,没有得到有利的证明
但是也得到了不少心得
3、总结一下自己的第一步应该如何迈出
定义什么是素数,就是大于1,不能被分解的数字,也就是非合数
2 3 5 7 9 11 13 17 19 23 29 31 37 ......
我本人是做C开发的,就用c来实现吧,需要啥工具都能自己造,虽然效率很低,但是很多事情都是可控的。
第一步,确认了,用c写一个简单的素数计算。别想太多,先迈出第一步。
int i = 0;
for (i=3;;i++) 因为我不知道如何直接定义到最大的素数哪里去,就从0开始,看看如何走到最后一步去
3 4 5 6 7 8 ....... 逐个增加
int j = 0;
for (j=2; j<i ; j++) 搞一个被除数,素数的第一个特性就是不能被小于自己的任何数整出掉,
ok,我们能初步的见到第一个算法了。
int i = 0;
int j = 0;
for (i=3; ; i++)
{
for (j=2; j<i; j++)
{
if (i%j == 0)
{
break;
}
}
printf("su : [%d]\n", i);//查了一遍,发现自己不能被分解,那么就是素数了
}
第一个逻辑算是完成了,这样我们就有出发的基础了。
2、观察自己的第一个作品和自己的目标有多大的差距,发现差距不小。
gcc 以后 执行他。发现,100w以内的数字,计算速度还行,到了100w以后,这个模型就是一个垃圾了。
与这个 2^74207281-1 的差距不是一般的小啊。
明显可见的问题,我们先来解决一下
1、int能够表达的范围,是多少呢?
2、如果我想做一个超大数字的计算,这个数字有1亿位数,我该如何设计
3、基础的大数运算,是否能够满足高速运算的需求
4、如果想做分布式运算,该如何搞
5、自己的素数算法是否有地方可以改进
6、2016年到2017年一年的时间了,为何没有更大的素数出现,前进一步是否有目前计算领域无法跨越的鸿沟。
7、如果计算一个G大小的数字,在平行推进时,若时间单位时以年为计算单位,自己的工作是否能够坚持下来。
8、如果这将是一个毕生的工作,项目的可持续发展如何做。
3、不管那么多了,从基础入手吧,能掌握一些,熟练一些,总是没有坏处的。
简单的思考一下上面的问题。
1、 int 是一个数字类型,在计算领域里面,存储用的是bit,0和1
8bit 是一个 byte,也就是 00000000,或者11111111
一个byte能表达一个什么范围的数字呢?
0 - 2^8 ---- > 0 1 2 4 8 32 64 128 256
一个int呢在32位计算机里面,是4个byte,默认是这样,我就当默认的是对的,不对再说吧
如果用无符号来表示的话,那就是2^(8*4) 4294967296
这看起来是一个很大的数字,不过数位数就不经数了,10位而已,距离1亿位,仅仅是刚起步。
查询了一下,当前的数字表达标准模型,没有来描述这么大数字的,那就只能自己造一个超大数的体系了。
其他问题,等待第二弹吧,我们来逐步解开这个工程,喜欢小伙伴和我qq交流,打电话不方便了。