Python/algorithms/cryptography/shor_algorithm.py
Aditya Kumar Mishra f610031f9e
Added classical implementation of Shor’s Algorithm
- Implemented a classical simulation of Shor’s Algorithm in `algorithms/cryptography/shor_algorithm.py`
- The algorithm factors a composite number N without using quantum computing libraries
- Uses modular exponentiation and order-finding to determine factors
- Includes an example usage for testing
2025-01-29 19:47:41 +05:30

57 lines
1.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import math
import random
def gcd(a, b):
"""Computes the greatest common divisor using Euclidean algorithm."""
while b:
a, b = b, a % b
return a
def modular_exponentiation(base, exp, mod):
"""Computes (base^exp) % mod using fast modular exponentiation."""
result = 1
while exp > 0:
if exp % 2 == 1:
result = (result * base) % mod
base = (base * base) % mod
exp //= 2
return result
def find_order(a, N):
"""Finds the smallest r such that a^r ≡ 1 (mod N)"""
r = 1
while modular_exponentiation(a, r, N) != 1:
r += 1
if r > N: # Prevent infinite loops
return None
return r
def shor_algorithm(N):
"""Simulates Shors Algorithm classically to factorize N."""
if N % 2 == 0:
return 2, N // 2 # Trivial case if N is even
while True:
a = random.randint(2, N - 1)
factor = gcd(a, N)
if factor > 1:
return factor, N // factor # Lucky case: a and N are not coprime
r = find_order(a, N)
if r is None or r % 2 == 1:
continue # Retry if order is not even
factor1 = gcd(modular_exponentiation(a, r // 2, N) - 1, N)
factor2 = gcd(modular_exponentiation(a, r // 2, N) + 1, N)
if 1 < factor1 < N:
return factor1, N // factor1
if 1 < factor2 < N:
return factor2, N // factor2
# Example usage
if __name__ == "__main__":
N = 15 # You can test with 21, 35, 55, etc.
factors = shor_algorithm(N)
print(f"Factors of {N}: {factors}")