mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Compare commits
10 Commits
44272e6d0a
...
c40fe7e205
Author | SHA1 | Date | |
---|---|---|---|
|
c40fe7e205 | ||
|
f3f32ae3ca | ||
|
5305f5a3b4 | ||
|
30d41fbd50 | ||
|
73ffa2485d | ||
|
ebf66fb78c | ||
|
17ec57437e | ||
|
656c6b512e | ||
|
a616dc90ab | ||
|
7655bf3f65 |
|
@ -16,7 +16,7 @@ repos:
|
||||||
- id: auto-walrus
|
- id: auto-walrus
|
||||||
|
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: v0.7.3
|
rev: v0.7.4
|
||||||
hooks:
|
hooks:
|
||||||
- id: ruff
|
- id: ruff
|
||||||
- id: ruff-format
|
- id: ruff-format
|
||||||
|
|
|
@ -1192,6 +1192,7 @@
|
||||||
|
|
||||||
## Quantum
|
## Quantum
|
||||||
* [Q Fourier Transform](quantum/q_fourier_transform.py)
|
* [Q Fourier Transform](quantum/q_fourier_transform.py)
|
||||||
|
* [Shor Algorithm](quantum/shor_algorithm.py)
|
||||||
|
|
||||||
## Scheduling
|
## Scheduling
|
||||||
* [First Come First Served](scheduling/first_come_first_served.py)
|
* [First Come First Served](scheduling/first_come_first_served.py)
|
||||||
|
|
66
quantum/shor_algorithm.py
Normal file
66
quantum/shor_algorithm.py
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
import math
|
||||||
|
import random
|
||||||
|
|
||||||
|
"""
|
||||||
|
Shor Algorithm is one of the basic quantum computing algorithm
|
||||||
|
that is used in breaking the RSA cryptography protocol, by finding the
|
||||||
|
prime numbers that are used to create the public key value, n
|
||||||
|
|
||||||
|
In this implementation, I have used a very simple construct without
|
||||||
|
the use of qiskit or cirq to help understand how Shor algorithm's
|
||||||
|
idea actually works.
|
||||||
|
|
||||||
|
Website referred for shor algorithm:
|
||||||
|
https://www.geeksforgeeks.org/shors-factorization-algorithm/
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class Shor:
|
||||||
|
def period_find(self, num: int, number: int) -> int:
|
||||||
|
"""
|
||||||
|
Find the period of a^x mod N.
|
||||||
|
|
||||||
|
>>> shor = Shor()
|
||||||
|
>>> shor.period_find(2, 15)
|
||||||
|
4
|
||||||
|
>>> shor.period_find(3, 7)
|
||||||
|
6
|
||||||
|
"""
|
||||||
|
start: int = 1
|
||||||
|
while pow(num, start, number) != 1:
|
||||||
|
start += 1
|
||||||
|
return start
|
||||||
|
|
||||||
|
def shor_algorithm(self, number: int) -> tuple[int, int]:
|
||||||
|
"""
|
||||||
|
Run Shor's algorithm to factor a number.
|
||||||
|
>>> shor = Shor()
|
||||||
|
>>> random.seed(0)
|
||||||
|
>>> factors = shor.shor_algorithm(15)
|
||||||
|
>>> isinstance(factors, tuple) and len(factors) == 2
|
||||||
|
True
|
||||||
|
>>> factors
|
||||||
|
(3, 5)
|
||||||
|
"""
|
||||||
|
if number % 2 == 0:
|
||||||
|
return 2, number // 2
|
||||||
|
while True:
|
||||||
|
random.seed(0)
|
||||||
|
num: int = random.randint(2, number - 1)
|
||||||
|
gcd_number_num: int = math.gcd(number, num)
|
||||||
|
if gcd_number_num > 1:
|
||||||
|
return gcd_number_num, number // gcd_number_num
|
||||||
|
|
||||||
|
result: int = self.period_find(num, number)
|
||||||
|
if not result % 2:
|
||||||
|
start: int = pow(num, result // 2, number)
|
||||||
|
if start != number - 1:
|
||||||
|
p_value: int = math.gcd(start - 1, number)
|
||||||
|
q_value: int = math.gcd(start + 1, number)
|
||||||
|
if p_value > 1 and q_value > 1:
|
||||||
|
return p_value, q_value
|
||||||
|
|
||||||
|
|
||||||
|
shor = Shor()
|
||||||
|
print(shor.shor_algorithm(15))
|
Loading…
Reference in New Issue
Block a user