Ket quantum programming language interpreter and library
Project description
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:
head, *tail = qubits
H(head)
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)
adj(qft, reg1)
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):
adj(entangle, quantum_message, entangled_qubit)
return measure(entangled_qubit), measure(quantum_message)
@code_ket
def decode(classical_message: tuple[int, int], qubit: quant):
if classical_message[0] == 1:
X(qubit)
if classical_message[1] == 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
Roadmap :notebook_with_decorative_cover:
-
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for ket_lang-0.6.1.dev1-py3-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8528ae77c9a868cd6f5bf7b46ac72e6ae19ba4850a8332c9bfe4b973b05f4026 |
|
MD5 | 2560a08b46544768de7eb1b04e7704c3 |
|
BLAKE2b-256 | 9818de6b0112322a42016162db9d3e2a4550880302ae60505b4efb82cb634e16 |
Hashes for ket_lang-0.6.1.dev1-py3-none-manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 187efcb589da2833fa9aaff6b8ba98915023b99d7155c08f9d23d71ca5ee0fea |
|
MD5 | ffe06190c533ee5dbfe077f3290db414 |
|
BLAKE2b-256 | dab3b992701fdb0b55b00106a4fb995db6b5cce8ddff086d4a09d7c0eafca222 |
Hashes for ket_lang-0.6.1.dev1-py3-none-manylinux_2_28_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 10f4a5ae7ae75d105e6b9b6aaec1d3b3f00f2a89f26ad9947c047ceb278395e9 |
|
MD5 | 43f0d3dfb30cada5d517528c5e41bffa |
|
BLAKE2b-256 | 3d1548b84fb40a39d210e5d6a8c901b276fa71215d1aff6a3dd3a4998fbed47c |
Hashes for ket_lang-0.6.1.dev1-py3-none-macosx_10_7_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77bf4604c5076e306a07cc46e884889d03b95f1b4fd40095072621a327ac67f4 |
|
MD5 | 5f83a170045391ba12821be2ccedf716 |
|
BLAKE2b-256 | 575ca242a494d594c85e1c411673a595a20ec7dee725e2ea08497f14280ae219 |