Permalink
Browse files

Integer#legendre: Add

  • Loading branch information...
1 parent 53baf1e commit aae502073741f258b3788475aaabfbfc6cd6f485 @runpaint committed Oct 18, 2010
Showing with 160 additions and 0 deletions.
  1. +18 −0 lib/numb/kronecker.rb
  2. +142 −0 spec/numb/legendre_spec.rb
View
18 lib/numb/kronecker.rb
@@ -80,4 +80,22 @@ def kronecker b
end
end
end
+
+ # Returns the Legendre symbol for `self`/`p`
+ #
+ # The Legendre symbol is a multiplicative function with values 1,
+ # −1, 0: its value on a (nonzero) quadratic residue mod `p` is 1 and
+ # on a quadratic non-residue is −1. It is defined only when `p` is
+ # an odd prime.
+ #
+ # 12345.legendre 331 #=> -1
+ # 0.legendre 83 #=> 0
+ # 55.legendre 10 #=> nil
+ # 6.legendre 7 #=> -1
+ #
+ # @param [Integer] p The "denominator"
+ # @return [Integer, nil] -1, 0, 1, or `nil`
+ def legendre p
+ kronecker(p) if p.odd? and p > 2 and p.prime?
+ end
end
View
142 spec/numb/legendre_spec.rb
@@ -0,0 +1,142 @@
+describe Integer, "#legendre" do
+
+ @seq = {
+ # A011582
+ 11 => [0,1,-1,1,1,1,-1,-1,-1,1,-1,0,1,-1,1,1,1,-1,-1,-1,
+ 1,-1,0,1,-1,1,1,1,-1,-1,-1,1,-1,0,1,-1,1,1,1,-1,
+ -1,-1,1,-1,0,1,-1,1,1,1,-1,-1,-1,1,-1,0,1,-1,1,1,
+ 1,-1,-1,-1,1,-1,0,1,-1,1,1,1,-1,-1,-1,1,-1,0,1,-1,
+ 1],
+ # A011583
+ 13 => [0,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,0,1,-1,1,1,-1,-1,
+ -1,-1,1,1,-1,1,0,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,0,
+ 1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,0,1,-1,1,1,-1,-1,-1,
+ -1,1,1,-1,1,0,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,0,1,
+ -1],
+ # A011584
+ 17 => [0,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,0,1,1,
+ -1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,0,1,1,-1,1,-1,
+ -1,-1,1,1,-1,-1,-1,1,-1,1,1,0,1,1,-1,1,-1,-1,-1,1,
+ 1,-1,-1,-1,1,-1,1,1,0,1,1,-1,1,-1,-1,-1,1,1,-1,-1,
+ -1],
+ # A011585
+ 19 => [0,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,0,
+ 1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,0,1,
+ -1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,0,1,-1,
+ -1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,0,1,-1,-1,
+ 1],
+
+ # A011586
+ 23 => [0,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,
+ -1,-1,-1,0,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,
+ -1,1,-1,-1,-1,-1,0,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,
+ -1,-1,1,-1,1,-1,-1,-1,-1,0,1,1,1,1,-1,1,-1,1,1,-1,
+ -1],
+ # A011587
+ 29 => [0,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,
+ -1,1,-1,1,1,1,1,-1,-1,1,0,1,-1,-1,1,1,1,1,-1,1,-1,
+ -1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,0,1,
+ -1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,
+ -1,1],
+ # A011588
+ 31 => [0,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,
+ -1,-1,-1,-1,1,-1,-1,1,-1,-1,0,1,1,-1,1,1,-1,1,1,1,
+ 1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,
+ -1,-1,0,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,
+ 1],
+ # A011589
+ 37 => [0,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,
+ -1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,0,1,
+ -1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,
+ 1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,0,1,-1,1,1,
+ -1,-1],
+ # A011590
+ 41 => [0,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,
+ -1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,
+ -1,1,1,0,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,
+ -1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,
+ 1,1,-1,1],
+ # A011591
+ 43 => [0,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,
+ -1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,
+ -1,1,1,-1,0,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,
+ 1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,
+ 1,-1],
+ # A011626
+ 227 => [0,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,
+ -1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,
+ 1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,
+ 1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,
+ -1],
+ # A011627
+ 229 => [0,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,
+ -1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,
+ -1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,
+ 1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,
+ 1],
+ # A011628
+ 233 => [0,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,
+ -1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,
+ -1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,
+ -1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,
+ -1,-1,-1],
+ # A165573
+ 257 => [0,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,
+ -1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,
+ -1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,
+ 1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,
+ 1,-1,1],
+ # A165574
+ 263 => [0,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,
+ -1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,
+ -1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,
+ 1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,
+ -1,1],
+ # A165471
+ 65537 => [0,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,
+ -1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,
+ -1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,
+ -1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,
+ -1,1,-1,1],
+ # A165476
+ 131071 => [0,1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,
+ -1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,
+ -1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,
+ -1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,
+ 1,-1,1,-1,1],
+ # A165481
+ 28657 => [0,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,
+ -1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,
+ -1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,
+ -1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,
+ -1,-1,-1,1],
+ # A165586
+ 514229 => [0,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,
+ 1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,
+ -1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,
+ -1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,
+ 1,1,1,1],
+ # A165581
+ 524287 => [0,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,
+ -1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,
+ -1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,
+ 1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,
+ -1,1,1,-1],
+ }
+
+ @seq.each do |p, as|
+ as.each_with_index do |l, a|
+ it "returns #{l} for #{a}.legendre(#{p})" do
+ a.legendre(p).should == l
+ end
+ end
+ end
+
+ [1, 2, 4].each do |b|
+ 100.times do |a|
+ it "returns nil for #{a}.legendre(#{b})" do
+ a.legendre(b).should be_nil
+ end
+ end
+ end
+end

0 comments on commit aae5020

Please sign in to comment.