[#105882] [Ruby master Bug#18280] Segmentation Fault in rb_utf8_str_new_cstr(NULL) — "ukolovda (Dmitry Ukolov)" <noreply@...>

Issue #18280 has been reported by ukolovda (Dmitry Ukolov).

13 messages 2021/11/01

[#105897] [Ruby master Bug#18282] Rails CI raises Segmentation fault with ruby 3.1.0dev supporting `Class#descendants` — "yahonda (Yasuo Honda)" <noreply@...>

Issue #18282 has been reported by yahonda (Yasuo Honda).

12 messages 2021/11/02

[#105909] [Ruby master Misc#18285] NoMethodError#message uses a lot of CPU/is really expensive to call — "ivoanjo (Ivo Anjo)" <noreply@...>

Issue #18285 has been reported by ivoanjo (Ivo Anjo).

37 messages 2021/11/02

[#105920] [Ruby master Bug#18286] Universal arm64/x86_84 binary built on an x86_64 machine segfaults/is killed on arm64 — "ccaviness (Clay Caviness)" <noreply@...>

Issue #18286 has been reported by ccaviness (Clay Caviness).

16 messages 2021/11/03

[#105928] [Ruby master Feature#18287] Support nil value for sort in Dir.glob — "Strech (Sergey Fedorov)" <noreply@...>

Issue #18287 has been reported by Strech (Sergey Fedorov).

16 messages 2021/11/04

[#105944] [Ruby master Bug#18289] Enumerable#to_a should delegate keyword arguments to #each — "Ethan (Ethan -)" <noreply@...>

Issue #18289 has been reported by Ethan (Ethan -).

8 messages 2021/11/05

[#105967] [Ruby master Bug#18293] Time.at in master branch was 25% slower then Ruby 3.0 — "watson1978 (Shizuo Fujita)" <noreply@...>

Issue #18293 has been reported by watson1978 (Shizuo Fujita).

17 messages 2021/11/08

[#106008] [Ruby master Bug#18296] Custom exception formatting should override `Exception#full_message`. — "ioquatix (Samuel Williams)" <noreply@...>

Issue #18296 has been reported by ioquatix (Samuel Williams).

14 messages 2021/11/10

[#106033] [Ruby master Bug#18330] Make failure on 32-bit Linux (Android) with Clang due to implicit 64-to-32-bit integer truncation — "xtkoba (Tee KOBAYASHI)" <noreply@...>

Issue #18330 has been reported by xtkoba (Tee KOBAYASHI).

10 messages 2021/11/11

[#106053] [Ruby master Misc#18335] openindiana ruby 3.1 preview needs --disable-dtrace — "stes (David Stes)" <noreply@...>

Issue #18335 has been reported by stes (David Stes).

14 messages 2021/11/14

[#106069] [Ruby master Feature#18339] GVL instrumentation API — "byroot (Jean Boussier)" <noreply@...>

Issue #18339 has been reported by byroot (Jean Boussier).

13 messages 2021/11/15

[#106145] [Ruby master Misc#18346] DevelopersMeeting20211209Japan — "mame (Yusuke Endoh)" <noreply@...>

Issue #18346 has been reported by mame (Yusuke Endoh).

11 messages 2021/11/18

[#106173] [Ruby master Feature#18349] Let --jit enable YJIT — "k0kubun (Takashi Kokubun)" <noreply@...>

Issue #18349 has been reported by k0kubun (Takashi Kokubun).

8 messages 2021/11/19

[#106175] [Ruby master Feature#18351] Support anonymous rest and keyword rest argument forwarding — "jeremyevans0 (Jeremy Evans)" <noreply@...>

Issue #18351 has been reported by jeremyevans0 (Jeremy Evans).

10 messages 2021/11/19

[#106279] [Ruby master Feature#18364] Add GC.stat_size_pool for Variable Width Allocation — "peterzhu2118 (Peter Zhu)" <noreply@...>

Issue #18364 has been reported by peterzhu2118 (Peter Zhu).

14 messages 2021/11/25

[#106308] [Ruby master Feature#18367] Stop the interpreter from escaping error messages — "mame (Yusuke Endoh)" <noreply@...>

Issue #18367 has been reported by mame (Yusuke Endoh).

13 messages 2021/11/29

[#106314] [Ruby master Feature#18368] Range#step semantics for non-Numeric ranges — "zverok (Victor Shepelev)" <noreply@...>

Issue #18368 has been reported by zverok (Victor Shepelev).

39 messages 2021/11/29

[#106341] [Ruby master Bug#18369] users.detect(:name, "Dorian") as shorthand for users.detect { |user| user.name == "Dorian" } — dorianmariefr <noreply@...>

Issue #18369 has been reported by dorianmariefr (Dorian Mari辿).

14 messages 2021/11/30

[#106347] [Ruby master Feature#18370] Call Exception#full_message to print exceptions reaching the top-level — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18370 has been reported by Eregon (Benoit Daloze).

10 messages 2021/11/30

[ruby-core:106283] [Ruby master Feature#12119] next_prime for lib/prime.rb

From: "hsbt (Hiroshi SHIBATA)" <noreply@...>
Date: 2021-11-26 05:55:05 UTC
List: ruby-core #106283
Issue #12119 has been updated by hsbt (Hiroshi SHIBATA).

Assignee deleted (yugui (Yuki Sonoda))
Status changed from Assigned to Closed

prime.rb was extracted to https://github.com/ruby/prime as the bundled gems now.



----------------------------------------
Feature #12119: next_prime for lib/prime.rb
https://bugs.ruby-lang.org/issues/12119#change-94908

* Author: dankogai (Dan Kogai)
* Status: Closed
* Priority: Normal
----------------------------------------
cf. https://github.com/ruby/ruby/pull/1272
 
## Rationale

To me, integer-without-limit is one of the greatest features of Ruby. I am currently working on my own implementation of arbitrary precision number system (https://github.com/dankogai/swift-pons) and ruby has been my sensei.

That is why I am disappointed to find prime.rb is pretty darn impractical, even for such "small" numbers below the 64-bit boundary. Consider this:

    ruby -rprime -e 'p (2**61-1).prime?' # hello, anybody home?

M61 is well below an ordinary, fixed, 64-bit integer can hold.

This patch makes prime.rb a little more practical by:

* making .prime? base upon Miller-Rabin primarity test
  * but unlike other patch proposals (like https://bugs.ruby-lang.org/issues/11578 ), this one is deterministic up to 318665857834031151167461, well over uint64_t max.
* adding .next_prime and .prev_prime which returns the (next|previous) prime.
* adding Prime::NextPrimeGenerator which makes use of .next_prime.

## vs. OpenSSL::BN 

Like current prime.rb, this patch is by no means to replace OpenSSL::BN.prime?. For very large numbers OpenSSL::BN is still faster. But for numbers below 32-bit limit this patch is faster. And for numbers between 32-bit limit and 64-bit limit, its performance is okay.

    # coding: utf-8
    require 'benchmark'
    require 'prime'
    require 'openssl'
    
    count = 10000
    
    [
      2147483647,                # int32 max == M31
      2147483647*2147483629,     # M31 * M31.prev_prime                             
      18446744073709551427,      # the largest prime uint64_t can handle
      318665857834031151167461,  # A014233_11
      # found at:
      # https://rosettacode.org/wiki/Miller窶迭abin_primality_test
      4547337172376300111955330758342147474062293202868155909489, # prime
      4547337172376300111955330758342147474062293202868155909393  # composite
    ].each do |n|
      primerbsays   = n.prime?
      opensslbnsays = OpenSSL::BN.new(n.to_s).prime?
      puts "#{n}.prime? => #{primerbsays}"
      puts "OpenSSL::BN.new(#{n}.to_s).prime? => #{opensslbnsays}"
      puts "Do they agree? #{primerbsays == opensslbnsays}"
      Benchmark.bm do |x|
        x.report("OPENSSL::BN") {
          count.times { OpenSSL::BN.new(n.to_s).prime? }
        }
        x.report("prime.rb") {
          count.times { n.prime? }
        }
      end
    end

On my iMac (Retina 5K, 27-inch, Late 2014):

    2147483647.prime? => true
    OpenSSL::BN.new(2147483647.to_s).prime? => true
    Do they agree? true
           user     system      total        real
    OPENSSL::BN  1.320000   0.020000   1.340000 (  1.344709)
    prime.rb  0.180000   0.000000   0.180000 (  0.185658)
    1152921504606846976.prime? => false
    OpenSSL::BN.new(1152921504606846976.to_s).prime? => false
    Do they agree? true
           user     system      total        real
    OPENSSL::BN  0.010000   0.000000   0.010000 (  0.009601)
    prime.rb  0.000000   0.000000   0.000000 (  0.001034)
    4611685975477714963.prime? => false
    OpenSSL::BN.new(4611685975477714963.to_s).prime? => false
    Do they agree? true
           user     system      total        real
    OPENSSL::BN  0.150000   0.000000   0.150000 (  0.155979)
    prime.rb  0.330000   0.010000   0.340000 (  0.332222)
    18446744073709551427.prime? => true
    OpenSSL::BN.new(18446744073709551427.to_s).prime? => true
    Do they agree? true
           user     system      total        real
    OPENSSL::BN  2.080000   0.020000   2.100000 (  2.110125)
    prime.rb  4.350000   0.020000   4.370000 (  4.392225)
    318665857834031151167461.prime? => false
    OpenSSL::BN.new(318665857834031151167461.to_s).prime? => false
    Do they agree? true
           user     system      total        real
    OPENSSL::BN  0.120000   0.000000   0.120000 (  0.126965)
    prime.rb  4.360000   0.010000   4.370000 (  4.377248)
    4547337172376300111955330758342147474062293202868155909489.prime? => true
    OpenSSL::BN.new(4547337172376300111955330758342147474062293202868155909489.to_s).prime? => true
    Do they agree? true
           user     system      total        real
    OPENSSL::BN  1.780000   0.000000   1.780000 (  1.791743)
    prime.rb 27.180000   0.180000  27.360000 ( 27.559330)
    4547337172376300111955330758342147474062293202868155909393.prime? => false
    OpenSSL::BN.new(4547337172376300111955330758342147474062293202868155909393.to_s).prime? => false
    Do they agree? true
           user     system      total        real
    OPENSSL::BN  0.190000   0.010000   0.200000 (  0.194814)
    prime.rb  1.960000   0.000000   1.960000 (  1.978851)

## Conclusion

IMHO the gap between prime.rb and OpenSSL::BN is now unacceptably too large. It was acceptable when native integers were only 32-bit wide. But it is 2016 and even your phone may be using 64-bit int.  .prime? should return instantly at least within 64-bit range.

Dan the Amateur Rubyist



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next