Spaces:
Sleeping
Sleeping
Upload verify_fso.py with huggingface_hub
Browse files- verify_fso.py +96 -0
verify_fso.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import math
|
| 2 |
+
|
| 3 |
+
def gcd(a, b):
|
| 4 |
+
while b:
|
| 5 |
+
a, b = b, a % b
|
| 6 |
+
return a
|
| 7 |
+
|
| 8 |
+
def phi(n):
|
| 9 |
+
result = n
|
| 10 |
+
p = 2
|
| 11 |
+
temp_n = n
|
| 12 |
+
while p * p <= temp_n:
|
| 13 |
+
if temp_n % p == 0:
|
| 14 |
+
while temp_n % p == 0:
|
| 15 |
+
temp_n //= p
|
| 16 |
+
result -= result // p
|
| 17 |
+
p += 1
|
| 18 |
+
if temp_n > 1:
|
| 19 |
+
result -= result // temp_n
|
| 20 |
+
return result
|
| 21 |
+
|
| 22 |
+
def test_theorem_2_1(m):
|
| 23 |
+
"""Theorem 2.1: N_b(m) = m^{m-1} * phi(m)"""
|
| 24 |
+
nb_theoretical = (m**(m-1)) * phi(m)
|
| 25 |
+
# Brute force count for small m
|
| 26 |
+
count = 0
|
| 27 |
+
for i in range(m**m):
|
| 28 |
+
b = []
|
| 29 |
+
temp = i
|
| 30 |
+
for _ in range(m):
|
| 31 |
+
b.append(temp % m)
|
| 32 |
+
temp //= m
|
| 33 |
+
if gcd(sum(b), m) == 1:
|
| 34 |
+
count += 1
|
| 35 |
+
print(f"Theorem 2.1 (m={m}): Theoretical={nb_theoretical}, Empirical={count}")
|
| 36 |
+
return nb_theoretical == count
|
| 37 |
+
|
| 38 |
+
def test_theorem_3_1(m, k):
|
| 39 |
+
"""Theorem 3.1: |M_k(G_m)| = phi(m) * [N_b(m)]^{k-1}"""
|
| 40 |
+
nb = (m**(m-1)) * phi(m)
|
| 41 |
+
mk_theoretical = phi(m) * (nb**(k-1))
|
| 42 |
+
print(f"Theorem 3.1 (m={m}, k={k}): Theoretical={mk_theoretical}")
|
| 43 |
+
return mk_theoretical
|
| 44 |
+
|
| 45 |
+
def test_theorem_4_1(m, k):
|
| 46 |
+
"""Theorem 4.1: Obstruction when m is even and k is odd"""
|
| 47 |
+
if m % 2 == 0 and k % 2 != 0:
|
| 48 |
+
print(f"Theorem 4.1 (m={m}, k={k}): Obstruction Predicted.")
|
| 49 |
+
return True
|
| 50 |
+
return False
|
| 51 |
+
|
| 52 |
+
def test_law_vi_2d(m):
|
| 53 |
+
"""Law VI: 2D Torus is universally solvable for all m"""
|
| 54 |
+
# Sum of two r_c must be m.
|
| 55 |
+
# For m=4, r=(1, 3) works. (1+3=4, gcd(1,4)=1, gcd(3,4)=1)
|
| 56 |
+
# For m=3, r=(1, 2) works. (1+2=3, gcd(1,3)=1, gcd(2,3)=1)
|
| 57 |
+
# Coprimality is possible for both odd and even m when k=2.
|
| 58 |
+
if m % 2 == 0:
|
| 59 |
+
# Sum of two odd numbers is even. r1=1, r2=m-1 are both odd.
|
| 60 |
+
r1, r2 = 1, m-1
|
| 61 |
+
valid = (gcd(r1, m) == 1 and gcd(r2, m) == 1)
|
| 62 |
+
else:
|
| 63 |
+
# Sum of an odd and an even is odd.
|
| 64 |
+
# But we need r1, r2 to be coprime to m.
|
| 65 |
+
# For m=3, r1=1, r2=2 works.
|
| 66 |
+
r1, r2 = 1, m-1
|
| 67 |
+
valid = (gcd(r1, m) == 1 and gcd(r2, m) == 1)
|
| 68 |
+
print(f"Law VI (m={m}, k=2): r=({r1}, {r2}), coprimality={valid}")
|
| 69 |
+
return valid
|
| 70 |
+
|
| 71 |
+
def test_spike_construction(m):
|
| 72 |
+
"""Theorem 5.1 & 5.3: Spike Construction (1, m-2, 1)"""
|
| 73 |
+
if m % 2 == 0:
|
| 74 |
+
return False
|
| 75 |
+
r = (1, m-2, 1)
|
| 76 |
+
sum_b0 = 2 % m
|
| 77 |
+
sum_b1 = (m-1) % m
|
| 78 |
+
sum_b2 = (m-1) % m
|
| 79 |
+
valid0 = gcd(sum_b0, m) == 1
|
| 80 |
+
valid1 = gcd(sum_b1, m) == 1
|
| 81 |
+
valid2 = gcd(sum_b2, m) == 1
|
| 82 |
+
print(f"Spike (m={m}): r={r}, sums=({sum_b0}, {sum_b1}, {sum_b2}), valid=({valid0}, {valid1}, {valid2})")
|
| 83 |
+
return valid0 and valid1 and valid2
|
| 84 |
+
|
| 85 |
+
if __name__ == "__main__":
|
| 86 |
+
print("--- FSO Mathematical Verification ---")
|
| 87 |
+
for m in [3, 4, 5]:
|
| 88 |
+
assert test_theorem_2_1(m)
|
| 89 |
+
assert test_theorem_3_1(3, 3) == 648
|
| 90 |
+
assert test_theorem_4_1(4, 3) == True
|
| 91 |
+
assert test_theorem_4_1(3, 3) == False
|
| 92 |
+
for m in [3, 4, 5, 6, 100, 101]:
|
| 93 |
+
assert test_law_vi_2d(m)
|
| 94 |
+
for m in [3, 5, 7, 9, 11, 13, 101]:
|
| 95 |
+
assert test_spike_construction(m)
|
| 96 |
+
print("--- All Tests Passed Successfully ---")
|