Shor的因式分解算法:
- Shor的因式分解算法由Peter Shor提出。
- 这表明量子力学允许因式分解在多项式时间内执行,而不是使用经典算法后实现的指数时间。
- 这可能会对数据安全领域产生巨大影响,这是基于大量素数分解的概念。
- 确实存在许多用于整数乘法的多项式时间算法(例如Euclid算法),但是不存在用于分解的多项式时间算法。
- 因此,Shor提出了一种算法,即Shor的因式分解算法,该算法可对L位的非素数N进行因式分解。
- 量子算法比经典算法好得多,因为它们基于量子傅立叶变换。
- 经典计算机上的运行时间为O [exp(L 1/3 (log L) 2/3 )] ,而量子计算机上的运行时间为O(L 3 ) 。
- 因此,Shor的算法原理上表明,量子计算机能够在多项式时间内分解非常大的数。
Shor的算法取决于:
- 模块化算术
- 量子并行
- 量子傅立叶变换
该算法表示为:
给定一个奇数的复合数N ,找到一个严格地在1到N之间的整数d ,该整数除以N。
Shor的算法包括以下两个部分:
- 将因式分解问题转换为寻找时期问题。这部分可以用经典方法来实现。
- 使用量子傅立叶变换找到周期或量子周期发现,并负责量子加速,并利用量子并行性。
在Shor算法,输入是无质数N和输出是N非细节因素
INPUT (N) —> SHOR’S ALGORITHM —> OUTPUT (Non-trivial factor of N)
算法:它包含几个步骤,仅在步骤2中需要使用量子计算机。
- 选择任意随机数,让我们说r ,使r
使得它们彼此互质。 - 量子计算机用于确定函数f r的未知周期p ,N (x)= r x mod N。
- 如果p是一个奇数整数,则返回到步骤1 。否则,继续下一步。
- 由于p是一个偶数整数,因此(r p / 2 – 1)(r p / 2 + 1)= r p – 1 = 0 modN 。
- 现在,如果r p / 2 + 1 = 0 mod N的值,请返回到步骤1 。
- 如果r p / 2 + 1!= 0 mod N的值,否则转到下一步。
- 计算d = gcd(r p / 2 -1,N) 。
- 要求的答案是“ d ”。
经典部分(订单查找问题):
这是定单查找问题的经典部分。给定x和N ,使得x
- 挑选一个随机数n ,使n
。计算gcd(n,N) 。 - 这可以使用Euclid算法来完成。
- 如果gcd(n,N)!= 1 ,则存在非平凡因数N.If (x + p)= n x + p mod N = n x mod N = f(x) 。
- 如果r为奇数,则返回步骤1 。
- 如果n p / 2 = -1(mod N) ,则返回到步骤1 。
- 的GCD(N P / 2 +/- 1,N)是N的非平凡的因子。
量子部分:
This is the quantum order finding part. Choose a power of 2, then
Q = 2L such that N2 <= Q <= 2N2
并考虑f = {0,1,2,…,Q-1}
式中,f(Y)= 1 /(Q)1/2Σx = 0时Q-1 I F(X)I W XY且w = EXP(2πI / Q),即第q个单位根。
- 让我们使用一个示例执行Shor算法:分解一个奇数N(令N = 17)。
- 选择一个整数Q,使N 2 <= Q≤2 N 2 (让Q = 324)。
- 然后,随机选择任何整数n,使gcd(n,N)= 1,(让我们选择整数为n = 7)。
- 然后创建两个量子寄存器(这些寄存器应纠缠在一起,以使输入寄存器的崩溃对应于输出寄存器的崩溃)
- 输入寄存器:必须包含足够的量子位来表示与Q-1一样大的数字(即最多323,因此我们需要9个量子位)。
- 输出寄存器:必须包含足够的量子位以表示最大为(N – 1)的数字。 (即,最多16个,因此我们需要4个量子位)。
代码 :
Python
from qiskit import IBMQ
from qiskit.aqua import QuantumInstance
from qiskit.aqua.algorithms import Shor
# Enter your API token here
IBMQ.enable_account('ENTER API TOKEN HERE')
provider = IBMQ.get_provider(hub='ibm-q')
# Specifies the quantum device
backend = provider.get_backend('ibmq_qasm_simulator')
print('\n Shors Algorithm')
print('--------------------')
print('\nExecuting...\n')
# Function to run Shor's algorithm
# where 21 is the integer to be factored
factors = Shor(35)
result_dict = factors.run(QuantumInstance(
backend, shots=1, skip_qobj_validation=False))
# Get factors from results
result = result_dict['factors']
print(result)
print('\nPress any key to close')
input()
输出 :
Shors Algorithm
- - - - - - - - - - - - -
Executing...
[[5,7]]
Press any key to close
上面代码的输出显示N = 35的因数5和7。