Ket quantum programming language interpreter and library

# Ket Quantum Programming

[[TOC]]

Ket is an embedded programming language that introduces the ease of Python to quantum programming, letting anyone quickly prototype and test a quantum application.

Python is the most widely used programming language for machine learning and data science and has been the language of choice for quantum programming. Ket is a Python-embedded language, but many can use it as a Python library in most cases. So you can use Ket together with NumPy, ScyPy, Pandas, and other popular Python libraries.

Ket's goal is to streamline the development of hardware-independent classical quantum applications by providing transparent interaction of classical and quantum data. See https://quantumket.org to learn more about Ket.

## Installation :arrow_down:

Ket requires Python 3.8 or newer and is available for Linux, Windows, and macOS. If you are not using x86_64 (example ARM), you must install Rust before installing Ket.

You can install Ket using pip. To do so, copy and paste the following command into your terminal:

pip install ket-lang


## Documentation :scroll:

Documentation available at https://quantumket.org.

## Examples :bulb:

### Grover's Algorithm

from ket import *
from math import sqrt, pi

def grover(n: int, oracle) -> int:
qubits = H(quant(n))
steps = int((pi/4)*sqrt(2**n))
for _ in range(steps):
oracle(qubits)
with around(H, qubits):
phase_on(0, qubits)
return measure(qubits).value

n = 8
looking_for = 13
print(grover(n, phase_on(looking_for)))
# 13


### Shor's Algorithm

from ket import *
from ket.plugins import pown
from random import randint
from functools import reduce
from math import log2, gcd

def qft(qubits: quant, invert: bool = True):
if len(qubits) == 1:
H(qubits)
else:
for i, c in enumerate(reversed(tail)):
ctrl(c, phase(pi / 2**(i + 1)), head)
qft(tail, invert=False)

if invert:
for i in range(len(qubits) // 2):
swap(qubits[i], qubits[- i - 1])

def quantum_subroutine(N, x):
n = N.bit_length()

def subroutine():
reg1 = H(quant(n))
reg2 = pown(x, reg1, N)
measure(reg2)
return measure(reg1).value

r = reduce(gcd, [subroutine() for _ in range(n)])
return 2**n//r

def shor(N: int) -> int:
if N % 2 == 0:
return 2
n = N.bit_length()
y = int(log2(N))
for b in range(2, n+1):
x = y/b
u1 = int(2**x)
u2 = u1+1
if u1**b == N:
return u1
elif u2**b == N:
return u2

for _ in range(N.bit_length()):
x = randint(2, N-1)
gcd_x_N = gcd(x, N)
if gcd_x_N > 1:
return gcd_x_N

r = quantum_subroutine(N, x)

if r % 2 == 0 and pow(x, r//2) != -1 % N:
p = gcd(x**(r//2)-1, N)
if p != 1 and p != N and p*N//p == N:
factor = p
break

q = gcd(x**(r//2)+1, N)
if q != 1 and q != N and q*N//q == N:
factor = q
break

if factor is not None:
return factor
else:
raise RuntimeError(f"fails to factor {N}")

N = 4063
p = shor(N)
q = N//p
print(f'{N}={p}x{q}')
# 4063=17x239


### Quantum Teleportation

from ket import *
from ket import code_ket

def entangle(a: quant, b: quant):
return cnot(H(a), b)

def teleport(quantum_message: quant, entangled_qubit: quant):
return measure(entangled_qubit), measure(quantum_message)

@code_ket
def decode(classical_message: tuple[int, int], qubit: quant):
if classical_message == 1:
X(qubit)

if classical_message == 1:
Z(qubit)

if __name__ == '__main__':
from math import pi

alice_message = phase(pi/4, H(quant()))

alice_message_dump = dump(alice_message)

alice_qubit, bob_qubit = entangle(*quant(2))

classical_message = teleport(
quantum_message=alice_message,
entangled_qubit=alice_qubit
)

decode(classical_message, bob_qubit)

bob_qubit_dump = dump(bob_qubit)

print('Alice Message:')
print(alice_message_dump.show())

print('Bob Qubit:')
print(bob_qubit_dump.show())
# Alice Message:
# |0⟩     (50.00%)
#  0.707107               ≅      1/√2
# |1⟩     (50.00%)
#  0.500000+0.500000i     ≅  (1+i)/√4
# Bob Qubit:
# |0⟩     (50.00%)
#  0.707107               ≅      1/√2
# |1⟩     (50.00%)
#  0.500000+0.500000i     ≅  (1+i)/√4


## Ket Development :hammer:

Setup for Ket development:

git clone https://gitlab.com/quantum-ket/ket.git
cd ket
pip install -e . --user


• Quantum code optimization.

• Quantum circuit visualization.

• :zap: We plan to expand the quantum library with quantum algorithm building blocks.

• :package: Full quantum algorithm implementations must be packaged with Ket as a dependency.

• :x: Low-level quantum control, like pulse programming, is out of Ket's scope.

## Cite Ket :book:

When using Ket for research projects, please cite:

Evandro Chagas Ribeiro da Rosa and Rafael de Santiago. 2021. Ket Quantum Programming. J. Emerg. Technol. Comput. Syst. 18, 1, Article 12 (January 2022), 25 pages. DOI: 10.1145/3474224

@article{ket,
author = {Evandro Chagas Ribeiro da Rosa and Rafael de Santiago},
title = {Ket Quantum Programming},
year = {2021},
issue_date = {January 2022},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
volume = {18},
number = {1},
issn = {1550-4832},
url = {https://doi.org/10.1145/3474224},
doi = {10.1145/3474224},
journal = {J. Emerg. Technol. Comput. Syst.},
month = oct,
articleno = {12},
numpages = {25},
keywords = {Quantum programming, cloud quantum computation, qubit simulation}
}


## Community :family:

Join the conversation on our Discord.

## Project details

This version 0.6.1 0.6.1rc1 pre-release 0.6.1.dev1 pre-release 0.6 0.6rc2 pre-release 0.6.0.dev1 pre-release 0.5.3 0.5.3b1 pre-release 0.5.2 0.5.1 0.5.1rc8 pre-release 0.5.1rc7 pre-release 0.5.1rc6 pre-release 0.5.1rc4 pre-release 0.5.1rc3 pre-release 0.5.1rc2 pre-release 0.5.1rc1 pre-release 0.5.1.dev2 pre-release 0.5.1.dev1 pre-release 0.5.0.1 0.5.0.1rc2 pre-release 0.5.0.1rc1 pre-release 0.5.0 0.5.0.dev3 pre-release 0.5.0.dev2 pre-release 0.5.0.dev1 pre-release 0.5.0.dev0 pre-release 0.4.4.dev0 pre-release 0.4.3 0.4.3rc1 pre-release 0.4.3.dev1 pre-release 0.4.2 0.4.1.post1 0.4.1 0.4 0.3.3 0.3.2 0.3.1 0.3 0.2.1 0.2 0.1.1 yanked 0.1 yanked

### Source Distribution

ket-lang-0.6.1.tar.gz (84.0 kB view hashes)

Uploaded source

### Built Distributions

ket_lang-0.6.1-py3-none-win_amd64.whl (62.7 MB view hashes)

Uploaded py3

ket_lang-0.6.1-py3-none-manylinux_2_28_x86_64.whl (746.8 kB view hashes)

Uploaded py3

ket_lang-0.6.1-py3-none-manylinux_2_28_aarch64.whl (695.6 kB view hashes)

Uploaded py3

ket_lang-0.6.1-py3-none-macosx_10_7_x86_64.whl (678.8 kB view hashes)

Uploaded py3