【问题标题】:Printing odd prime every 100K primes found每找到 100K 个素数打印奇数素数
【发布时间】:2015-03-17 04:49:14
【问题描述】:

我正在尝试使用 Potion 编写一个程序,打印每 100K 个奇数素数直到 10M,我的代码:

last = 3 
res = (last) # create array
loop:
   last += 2
   prime = true 
   len = res length -1
   i = 0
   while(i<len):
      v = res at(i)
      if(v*v > last): break.
      if(last%v == 0): prime = false, break.
      i += 1
   .
   if(prime):
          res append(last)
          if(res size % 100000 == 0): last print.
          if(last>9999999): break.
   .
.

但这给了Segmentation fault (core dumped),不知道怎么了?

供参考,工作Ruby版本:

res = [last=3]
loop do 
   last += 2
   prime = true
   res.each do |v|
          break if v*v > last 
          if last % v == 0 
        prime = false 
        break
      end
   end
   if prime
     res << last 
     puts last if res.length % 100000 == 0 
     break if last > 9999999
   end
end

输出应该是:

1299721
2750161
4256249
5800139
7368791
8960467

不,这不是家庭作业,只是出于好奇。

【问题讨论】:

  • 顺便说一句:固定版本的药水需要 6m31.999s。算法不是很好,但这里的 vm 是罪魁祸首。可怕。红宝石只需要 32 秒
  • 作为参考:我正在研究这个更快的素数示例:github.com/perl11/potion/blob/master/example/prime.pn
  • 很好,但这就是基准^_^

标签: primes potion


【解决方案1】:

你自己发现的,太好了! println 在药水中被称为say。 它在res size 中崩溃了。

例如使用它进行调试: rm config.inc make DEBUG=1 bin/potion -d -Dvt example/100thoddprime.pn

然后按回车键直到崩溃。

(example/100thoddprime.pn:18): res append(last)

&gt; ; (3, 5) [95] getlocal 1 1 ; (3, 5) [96] move 2 1 ; (3, 5) [97] loadk 1 5 ; size [98] bind 1 2 ; function size() [99] loadpn 3 0 ; nil [100] call 1 3Segmentation fault

所以 res 上的 size 返回 nil,这导致了崩溃。

而不是last print, "\n" print. 就做last say. 这来自 perl6 语法,对不起 :)

【讨论】:

    【解决方案2】:

    我的错,我在从0 to len (i) 更改时忘记从res length -1 更改为res length,因为此语法未被识别为循环(无法接收break)。

    last = 3
    res = (last)
    loop:
       last println
       last += 2
       prime = true
       len = res length
       i = 0
       while(i<len):
          v = res at(i)
          if(v*v > last): break.
          if(last%v == 0): prime = false, break.
          i += 1
       .
       if(prime):
          res append(last)
          if(res length % 100000 == 0): last print, "\n" print.
          if(last>9999999): break.
       .
    .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多