def mul_by_constant_modN(eng, c, N, quint_in):
"""
Multiplies a quantum integer by a classical number a modulo N, i.e.,
|x> -> |a*x mod N>
(only works if a and N are relative primes, otherwise the modular inverse
does not exist).
"""
assert(c < N and c >= 0)
assert(gcd(c, N) == 1)
n = len(quint_in)
quint_out = eng.allocate_qureg(n + 1)
for i in range(n):
with Control(eng, quint_in[i]):
AddConstantModN((c << i) % N, N) | quint_out
for i in range(n):
Swap | (quint_out[i], quint_in[i])
cinv = inv_mod_N(c, N)
for i in range(n):
with Control(eng, quint_in[i]):
SubConstantModN((cinv << i) % N, N) | quint_out
del quint_out
# calculates the inverse of a modulo N
评论列表
文章目录