📜  Shor的因式分解算法

📅  最后修改于: 2021-04-17 15:18:57             🧑  作者: Mango

Shor的因式分解算法

  • Shor的因式分解算法由Peter Shor提出。
  • 这表明量子力学允许因式分解在多项式时间内执行,而不是使用经典算法后实现的指数时间。
  • 这可能会对数据安全领域产生巨大影响,这是基于大量素数分解的概念。
  • 确实存在许多用于整数乘法的多项式时间算法(例如Euclid算法),但是不存在用于分解的多项式时间算法。
  • 因此,Shor提出了一种算法,即Shor的因式分解算法,该算法可对L位的非素数N进行因式分解。
  • 量子算法比经典算法好得多,因为它们基于量子傅立叶变换。
  • 经典计算机上的运行时间为O [exp(L 1/3 (log L) 2/3 )] ,而量子计算机上的运行时间为O(L 3 )
  • 因此,Shor的算法原理上表明,量子计算机能够在多项式时间内分解非常大的数。

Shor的算法取决于

  • 模块化算术
  • 量子并行
  • 量子傅立叶变换

该算法表示为

给定一个奇数的复合数N ,找到一个严格地在1N之间的整数d ,该整数除以N。

Shor的算法包括以下两个部分:

  • 将因式分解问题转换为寻找时期问题。这部分可以用经典方法来实现。
  • 使用量子傅立叶变换找到周期或量子周期发现,并负责量子加速,并利用量子并行性。

在Shor算法,输入是无质数N输出N非细节因素

算法:它包含几个步骤,仅在步骤2中需要使用量子计算机。

  1. 选择任意随机数,让我们说r ,使r 使得它们彼此互质。
  2. 量子计算机用于确定函数f r的未知周期p ,N (x)= r x mod N。
  3. 如果p是一个奇数整数,则返回到步骤1 。否则,继续下一步。
  4. 由于p是一个偶数整数,因此(r p / 2 – 1)(r p / 2 + 1)= r p – 1 = 0 modN
  5. 现在,如果r p / 2 + 1 = 0 mod N的值,请返回到步骤1
  6. 如果r p / 2 + 1!= 0 mod N的值,否则转到下一步。
  7. 计算d = gcd(r p / 2 -1,N)
  8. 要求的答案是“ d ”。

经典部分(订单查找问题):
这是定单查找问题的经典部分。给定xN ,使得x gcd(x,N)= 1x的阶数是最小的正整数y,因此x y = 1(mod N)

  1. 挑选一个随机数n ,使n 。计算gcd(n,N)
  2. 这可以使用Euclid算法来完成。
  3. 如果gcd(n,N)!= 1 ,则存在非平凡因数N.If (x + p)= n x + p mod N = n x mod N = f(x)
  4. 如果r为奇数,则返回步骤1
  5. 如果n p / 2 = -1(mod N) ,则返回到步骤1
  6. GCD(N P / 2 +/- 1,N)N的非平凡的因子。

量子部分:

并考虑f = {0,1,2,…,Q-1}

式中,f(Y)= 1 /(Q)1/2Σx = 0时Q-1 I F(X)I W XYw = 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。