aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakiyamn2021-05-14 14:10:56 +1000
committerakiyamn2021-05-14 14:10:56 +1000
commit6ef8a6758a155a4109f43ee58334caa02ecf6820 (patch)
tree3c4bd2ea821dd31b7710ca0151987bc8b8677372
parent25aee31da1a898407b0bdab94bd06acfa0280d36 (diff)
downloadfit3155-6ef8a6758a155a4109f43ee58334caa02ecf6820.tar.gz
fit3155-6ef8a6758a155a4109f43ee58334caa02ecf6820.zip
Ass 3: almost done q1
-rw-r--r--ass3/q1/twin_prime.py74
1 files changed, 31 insertions, 43 deletions
diff --git a/ass3/q1/twin_prime.py b/ass3/q1/twin_prime.py
index aaeeef8..f31f0fb 100644
--- a/ass3/q1/twin_prime.py
+++ b/ass3/q1/twin_prime.py
@@ -1,12 +1,13 @@
import random
import math
+import sys
def even(n):
return n % 2 == 0
-def is_really_prime(n):
+def naive_prime_test(n):
if n == 1 or even(n):
return False
for i in range(n - 1, 2, -1):
@@ -14,10 +15,6 @@ def is_really_prime(n):
return False
return True
-def pi2(n):
- c = 0.661618
- return 2 * c * (n / (math.log(n) ** 2))
-
def is_prime(x, k=20):
if even(x):
@@ -29,7 +26,6 @@ def is_prime(x, k=20):
while even(t):
s += 1
t //= 2
- assert math.floor(t) == t
witnesses = [random.randrange(2, x - 1) for _ in range(k)]
for w in witnesses:
if power_mod(w, x - 1, x) != 1:
@@ -38,7 +34,6 @@ def is_prime(x, k=20):
if power_mod(w, 2 ** i * t, x) == 1 and power_mod(w, 2 ** (i - 1) * t, x) not in [1, x - 1]:
return False
return True
- # return all(map(lambda w: is_prime(x, w), [2, 3, 5, 7, 11, 13, 17]))
def power_mod(base, power, mod):
@@ -52,47 +47,40 @@ def power_mod(base, power, mod):
return result % mod
-# for i in range(3, 100):
-# print(i, is_prime(i), is_really_prime(i))
-# if is_prime(i) != is_really_prime(i):
-# print("Liar", i, is_prime(i), is_really_prime(i))
-
-# is_really_prime(9)
-
-
-# for a in filter(is_really_prime, range(50000, 500000)):
-# if not miller_rabins(a, max(4, math.ceil(math.log(a, 4)))):
-# raise Exception(f"Didn't work for {a}")
-
-
def generate_twin_prime(m):
twin = False
while not twin:
- n = random.randrange(2 ** (m - 1), 2 ** m)
+ start, end = bit_range(m)
+ n = random.randrange(start + 6 - (start % 6), end, 6)
+ # n = random.randrange(2 ** (m - 1) + 6 - ((2 ** (m - 1)) % 6), 2 ** m, 6)
+ # n += 6 - (n % 6)
+ assert n % 6 == 0
iterations = max(4, math.ceil(math.log(n, 4)))
twin = is_prime(n - 1, iterations) and is_prime(n + 1, iterations)
- if not (is_really_prime(n - 1) and is_really_prime(n + 1)):
- raise Exception(f"{n-1}: {is_really_prime(n - 1)}, {n+1}: {is_really_prime(n + 1)}")
+ if not (naive_prime_test(n - 1) and naive_prime_test(n + 1)):
+ raise Exception(f"{n - 1}: {naive_prime_test(n - 1)}, {n + 1}: {naive_prime_test(n + 1)}")
+ assert n + 1 < 2 ** m
+ # print(f"{bin(2**m -1)[2:]}\n{bin(n-1)[2:]}\n{bin(n+1)[2:]}")
return n - 1, n + 1
+def bit_range(m):
+ return 2 ** (m - 1), 2 ** m
+
+def main():
+ assert len(sys.argv) >= 2
+ twin = generate_twin_prime(int(sys.argv[1]))
+ write_twin(twin)
+ print(twin)
+
+
+def write_twin(twin):
+ with open("output_twin_prime.txt", "w") as file:
+ file.write(f"{twin[0]}\n{twin[1]}")
+
+
+for i in range(3, 32):
+ print(i)
+ generate_twin_prime(i)
-for bits in range(3, 64):
- print(f"==== {bits} bits ==== {2 ** (bits - 1), 2 ** bits - 1}")
- for _ in range(1000):
- generate_twin_prime(bits)
- if _ % 50 == 0:
- print(".", end="")
- print()
-
-# i = 0
-# while True:
-# i += 1
-# base, power, mod = random.randint(1, 1000), random.randint(1, 5000), random.randint(1, 1000)
-# mine = power_mod(base, power, mod)
-# real = (base ** power) % mod
-# pass_test = mine == real
-# if i % 10000 == 0:
-# print(i)
-# if not pass_test:
-# # print(f"Failed for {base}^{power} mod {mod}. Got {mine}, expected {real}.")
-# raise Exception(f"Failed for {base}^{power} mod {mod}. Got {mine}, expected {real}.")
+if __name__ == "__main__":
+ main()