fu_prp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/bin/MyClass.rb +161 -0
  3. data/bin/glade/MyClass.glade +115 -0
  4. data/fu_prp.rb +14 -0
  5. metadata +91 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4704ebafd806f9c13ba246dbb8bfc74d8daeb7f8
4
+ data.tar.gz: 3084eacdc8470199f379d591f11ac39e48372ec1
5
+ SHA512:
6
+ metadata.gz: 7b362e906c0bd3acd618d91d4a03fd355b62b458d68c838fd529c86b97c6faacf82b2e7c90d6e7ae1b35ae9a3129ac8944ba237cdb565b4c0f6d33b23c4fd2fd
7
+ data.tar.gz: 7c2f507ee6baa388b955ccf992a74688d4d009e99eff763b8f35dccd583cd9afe30ed873ce36b9df6dd7efa9b15c6f760e13c451d7c072ab7e8105ffb1f15f93
data/bin/MyClass.rb ADDED
@@ -0,0 +1,161 @@
1
+
2
+ class Prp
3
+
4
+ def tf
5
+ return 0 if @n < 3
6
+ factors = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191]
7
+ @n < 2**64 ? sqrt = Math.sqrt(@n).to_i : sqrt = 2**64
8
+ factors.each do |i|
9
+ return i if @n%i == 0
10
+ return 1 if i >= sqrt
11
+ end
12
+ 0
13
+ end
14
+
15
+ def prp2?
16
+ b = 2
17
+ bin = (@n-1).to_s(2)[1..-1]
18
+ bin.each_char do |i|
19
+ b = (b**2)%@n
20
+ b = b*2 if bin[i] == "1"
21
+ end
22
+ b == 1
23
+ end
24
+
25
+ # http://www.mersenneforum.org/showpost.php?p=388342&postcount=1
26
+ def fu_test?
27
+ a = minimal_strong_jacobi
28
+ ap2 = a + 2
29
+ bin = (@n+1).to_s(2)[1..-1]
30
+ s,t = 1,2
31
+ bin.each_char do |i|
32
+ s,t = (s*(a*s+2*t))%@n,((t-s)*(t+s))%@n
33
+ s,t = ap2*s+t,2*t-s if bin[i] == "1"
34
+ end
35
+ s == 0 && t == (2*a+5)%@n
36
+ end
37
+
38
+ # http://primes.utm.edu/glossary/xpage/JacobiSymbol.html
39
+ def minimal_strong_jacobi
40
+ return 0 if @n%4 == 3
41
+ return 1 if @n%6 == 5
42
+ a = 2
43
+ n = 0
44
+ j = 0
45
+ while n != 1 || j != -1
46
+ a += 1
47
+ d = a**2 - 4
48
+ n = @n
49
+ j = 1
50
+ while !d.zero?
51
+ while d.even?
52
+ d /= 2
53
+ j = -j if n%8 == 3 || n%8 == 5
54
+ end
55
+ d,n = n,d
56
+ j = -j if d%4 == 3 && n%4 == 3
57
+ d %= n
58
+ end
59
+ end
60
+ a
61
+ end
62
+
63
+ # https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Binary_numeral_system_.28base_2.29
64
+ def square?
65
+ return false if @n%4 == 3
66
+ num = @n
67
+ res = 0
68
+ bit = 1
69
+ bit <<= 2 while bit <= num
70
+ while bit != 0
71
+ if num >= res + bit
72
+ num -= res + bit
73
+ res = (res >> 1) + bit
74
+ else
75
+ res >>= 1
76
+ end
77
+ bit >>= 2
78
+ end
79
+ @n == res**2
80
+ end
81
+
82
+ def value
83
+ @n
84
+ end
85
+
86
+ def initialize(str_n)
87
+ @n = str_n.gsub(/(\D|\s)/,'').to_i
88
+ end
89
+ end
90
+
91
+ class MyClass #(change name)
92
+
93
+ include GladeGUI
94
+
95
+ def before_show()
96
+ @button1 = "Run PRP Test"
97
+ @do_prp2 = false
98
+ @do_tf = false
99
+ end
100
+
101
+ def on_checkbutton1_toggled(*args)
102
+ @do_tf ? @do_tf = false : @do_tf = true
103
+ end
104
+
105
+ def on_checkbutton2_toggled(*args)
106
+ @do_prp2 ? @do_prp2 = false : @do_prp2 = true
107
+ end
108
+
109
+ def on_button1_clicked(*args)
110
+ n = Prp.new(@builder["entry1"].text)
111
+ if @do_tf
112
+ factor = n.tf
113
+ if factor > 1
114
+ @builder["label1"].label = "Has small factor, " + factor.to_s
115
+ return
116
+ elsif factor == 1
117
+ @builder["label1"].label = " Is prime!"
118
+ return
119
+ end
120
+ end
121
+ if n.value.zero?
122
+ @builder["label1"].label = "0 is zero."
123
+ return
124
+ elsif n.value == 1
125
+ @builder["label1"].label = "1 is a unit."
126
+ return
127
+ elsif n.value == 2
128
+ @builder["label1"].label = "2 is prime!"
129
+ return
130
+ elsif n.value.even?
131
+ @builder["label1"].label = "n is even."
132
+ return
133
+ elsif n.square?
134
+ @builder["label1"].label = "n is a square."
135
+ return
136
+ end
137
+ answer = ""
138
+ prp = true
139
+ if @do_prp2
140
+ if n.prp2?
141
+ answer += " Passed 2^(n-1)==1 (mod n)."
142
+ else
143
+ answer += " Failed 2^(n-1)==1 (mod n)."
144
+ prp = false
145
+ end
146
+ end
147
+ if prp
148
+ if n.fu_test?
149
+ answer += " Passed the main test."
150
+ else
151
+ answer += " Failed the main test."
152
+ prp = false
153
+ end
154
+ end
155
+ prp ? answer += " Is likely prime!" : answer += " Is composite :("
156
+ @builder["label1"].label = answer
157
+ @builder["entry1"].text = n.value.to_s
158
+ end
159
+
160
+ end
161
+
@@ -0,0 +1,115 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <interface>
3
+ <!-- interface-requires gtk+ 3.0 -->
4
+ <!-- interface-naming-policy toplevel-contextual -->
5
+ <object class="GtkWindow" id="window1">
6
+ <property name="visible">True</property>
7
+ <property name="can_focus">False</property>
8
+ <property name="title" translatable="yes">Frobenius Underwood PRP Test</property>
9
+ <property name="modal">True</property>
10
+ <property name="window_position">center-always</property>
11
+ <property name="default_width">300</property>
12
+ <property name="default_height">200</property>
13
+ <signal name="destroy" handler="destroy_window" swapped="no"/>
14
+ <child>
15
+ <object class="GtkFixed" id="fixed1">
16
+ <property name="width_request">1100</property>
17
+ <property name="height_request">450</property>
18
+ <property name="visible">True</property>
19
+ <property name="can_focus">False</property>
20
+ <child>
21
+ <object class="GtkEntry" id="entry1">
22
+ <property name="width_request">1000</property>
23
+ <property name="height_request">72</property>
24
+ <property name="visible">True</property>
25
+ <property name="can_focus">True</property>
26
+ <property name="tooltip_text" translatable="yes">Enter an integer. Non-numerals will be removed.</property>
27
+ <property name="max_length">65535</property>
28
+ <property name="invisible_char">●</property>
29
+ <property name="primary_icon_activatable">False</property>
30
+ <property name="secondary_icon_activatable">False</property>
31
+ <property name="primary_icon_sensitive">True</property>
32
+ <property name="secondary_icon_sensitive">True</property>
33
+ </object>
34
+ <packing>
35
+ <property name="x">45</property>
36
+ <property name="y">124</property>
37
+ </packing>
38
+ </child>
39
+ <child>
40
+ <object class="GtkLabel" id="label1">
41
+ <property name="width_request">900</property>
42
+ <property name="height_request">80</property>
43
+ <property name="visible">True</property>
44
+ <property name="can_focus">False</property>
45
+ <property name="label" translatable="yes">Enter a candidate number above.</property>
46
+ </object>
47
+ <packing>
48
+ <property name="x">100</property>
49
+ <property name="y">209</property>
50
+ </packing>
51
+ </child>
52
+ <child>
53
+ <object class="GtkCheckButton" id="checkbutton1">
54
+ <property name="label" translatable="yes">Trial Factor</property>
55
+ <property name="width_request">176</property>
56
+ <property name="height_request">80</property>
57
+ <property name="visible">True</property>
58
+ <property name="can_focus">True</property>
59
+ <property name="receives_default">False</property>
60
+ <property name="draw_indicator">True</property>
61
+ <signal name="toggled" handler="on_checkbutton1_toggled" swapped="no"/>
62
+ </object>
63
+ <packing>
64
+ <property name="x">130</property>
65
+ <property name="y">300</property>
66
+ </packing>
67
+ </child>
68
+ <child>
69
+ <object class="GtkCheckButton" id="checkbutton2">
70
+ <property name="label" translatable="yes">Check 2^(n-1)==1 (mod n)</property>
71
+ <property name="width_request">350</property>
72
+ <property name="height_request">80</property>
73
+ <property name="visible">True</property>
74
+ <property name="can_focus">True</property>
75
+ <property name="receives_default">False</property>
76
+ <property name="draw_indicator">True</property>
77
+ <signal name="toggled" handler="on_checkbutton2_toggled" swapped="no"/>
78
+ </object>
79
+ <packing>
80
+ <property name="x">330</property>
81
+ <property name="y">300</property>
82
+ </packing>
83
+ </child>
84
+ <child>
85
+ <object class="GtkButton" id="button1">
86
+ <property name="label" translatable="yes">Run PRP Test</property>
87
+ <property name="width_request">200</property>
88
+ <property name="height_request">80</property>
89
+ <property name="visible">True</property>
90
+ <property name="can_focus">True</property>
91
+ <property name="receives_default">True</property>
92
+ <signal name="clicked" handler="on_button1_clicked" swapped="no"/>
93
+ </object>
94
+ <packing>
95
+ <property name="x">744</property>
96
+ <property name="y">300</property>
97
+ </packing>
98
+ </child>
99
+ <child>
100
+ <object class="GtkLabel" id="label2">
101
+ <property name="width_request">945</property>
102
+ <property name="height_request">80</property>
103
+ <property name="visible">True</property>
104
+ <property name="can_focus">False</property>
105
+ <property name="label" translatable="yes">Tests: x^(n+1)==2*a+5 (mod n, x^2-a*x+1), min a&gt;=0: jacobi(a^2-4,n)==-1</property>
106
+ </object>
107
+ <packing>
108
+ <property name="x">77</property>
109
+ <property name="y">20</property>
110
+ </packing>
111
+ </child>
112
+ </object>
113
+ </child>
114
+ </object>
115
+ </interface>
data/fu_prp.rb ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'vrlib'
4
+
5
+ #make program output in real time so errors visible in VR.
6
+ STDOUT.sync = true
7
+ STDERR.sync = true
8
+
9
+ #everything in these directories will be included
10
+ my_path = File.expand_path(File.dirname(__FILE__))
11
+ require_all Dir.glob(my_path + "/bin/**/*.rb")
12
+
13
+ MyClass.new.show
14
+
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fu_prp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Your Name
8
+ autorequire:
9
+ bindir:
10
+ - "."
11
+ cert_chain: []
12
+ date: 2015-03-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: vrlib
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 0.0.1
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 0.0.1
28
+ - !ruby/object:Gem::Dependency
29
+ name: gtk2
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 0.0.1
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 0.0.1
42
+ - !ruby/object:Gem::Dependency
43
+ name: require_all
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 0.0.1
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 0.0.1
56
+ description: A 2 selfridge test with optional 2-PRP test and trial division. Integer
57
+ input.
58
+ email: paulunderwood@mindlesl.com
59
+ executables:
60
+ - fu_prp.rb
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - "./fu_prp.rb"
65
+ - bin/MyClass.rb
66
+ - bin/glade/MyClass.glade
67
+ - fu_prp.rb
68
+ homepage: http://www.mersenneforum.org/showpost.php?p=388342&postcount=1
69
+ licenses: []
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - "."
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project: nowarning
87
+ rubygems_version: 2.4.5
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: 2 Selfrdige PRP test.
91
+ test_files: []