教你用Ruby算命!

博主使用Ruby语言通过费马小定理实现了一个简单的素数判断算法,成功计算出了几个梅森素数,并表达了对历史上的梅森素数发现者的感慨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文又名《看看我的破机器能算多少个梅森数出来》

代码如下,

mersennes=[]

def is_prime?(n)
# 这里是用了费马小定理,很慢很慢!
(2..n-1).each{|y| y**(n-1)%n==1?true:(return false)}
end

(1..13).each do |n|
m=(2**n-1)
mersennes<<m if is_prime?(m)
end

#mersennes=(1..13).inject([]){|arr,x|is_prime?(2**x-1)?arr:(arr<<2**x-1)}
#上面这个写法,2**x要计算两次,写法好看,但性能很低

p mersennes


我算到(1..14)这里就不敢再增加range的范围了,(1..15)我的台式机跑了半天也没有跑出结果,看来我的电脑太慢了。

最后我得到的梅森数数组是:

[1, 3, 7, 31, 127, 8191]


我只算到了M4,1不算梅森数。

对照梅森数的发现史,我发现历史上从M5开始的发现者才被历史记录,M4及以前的发现者都被遗忘了,或者估计其它的成就没有多少,碌碌无为。以前算到M4的那哥们是个无名氏,苦命的孩儿啊。我估计大部分人也都差不多会碌碌无为终了一生。目前我只能算到这一位,等有空用Erlang改进下看看,看看自己能否进入被历史记住的人物名单。

我说完了,你们自己也算算吧,看你们排行老几。

PS:我那个is_prime?这个判断素数的算法是很浪费性能的,不过它不会错过一个漏网之鱼,比Miller-Rabin算法好在这里,但是太慢!

梅森素数列表:[url]http://zh.wikipedia.org/w/index.php?title=梅森素数&variant=zh-cn[/url]


[img]/upload/attachment/91989/90421bb9-6415-3942-bd9f-730b0ac7a490.png[/img]


《纯粹娱乐,别太计较,不过很好玩^-^》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值