14个不稳定版本 (4个破坏性更新)

0.5.0-alpha2022年12月1日
0.4.4 2022年11月21日
0.4.2 2022年8月2日
0.4.1 2022年5月1日
0.3.0 2021年7月19日

#288 in 数学


用于qvnt-i

Apache-2.0

2.5MB
5K SLoC

QVNT

build rustc crates.io docs.rs

高级量子计算模拟器,用Rust编写

特性

  1. 能够模拟多达64个量子比特。具有4-16 Gb RAM的普通机器能够模拟26-28个量子比特,这对于几个研究案例来说足够了;
  2. 一套1-或2量子比特操作来构建自己的量子线路;
  3. 量子操作经过测试和调试,以确保使用安全;
  4. 使用Rayon库的多线程加速线路执行;
  5. 复杂的量子寄存器操作:两个寄存器的张量积以及量子比特到寄存器的别名,以简化与寄存器的交互。

用法

将以下行添加到您的Cargo.toml文件中以使用QVNTcrate

[dependencies]
qvnt = { version = "0.4.2", features = ["multi-thread"] }

量子寄存器和算子由位掩码控制。其中的每个将对特定的量子比特起作用。

use qvnt::prelude::*;

//  Create quantum register with 10 qubits
let mut q_reg = QReg::new(10);
//  or with initial state, where 5th, 6th and 7th qubits are already in state |1>.
let mut q_reg = QReg::with_state(10, 0b0011100000);

//  Create qft (Quantum Fourier Transform) operation, acting on first 5 qubits in q_reg.
let op = op::qft(0b0000011111);

//  Apply created operation
q_reg.apply(&op);

//  Measure and write first 3 qubit, which leads to collapse of q_reg wave function.
//  Measured variable will contain one of the following values:
//  0b000, 0b001, 0b010, 0b011, 0b100, 0b101, 0b110, 0b111
let measured = q_reg.measure_mask(0b0000000111);

您可以使用VReg来简化操作定义

use qvnt::prelude::*;

let mut q_reg = QReg::new(10);
let q = q_reg.get_vreg();

//  Crate Hadamard operator, that act on odd qubits.
let op = op::h(q[1] | q[3] | q[5] | q[7] | q[9]);
//  This is equivalent to op::h(0b0101010101);

实现的操作

  • 泡利XYZ算子;
  • Z的平方和四次方根 - ST算子;
  • 相位移算子 - phi
  • 1量子比特旋转算子 - rxryrz
  • 2量子比特旋转算子,即伊辛耦合门 - rxxryyrzz
  • SWAPiSWAP算子和它们的平方根;
  • 量子傅里叶变换和Hadamard变换;
  • 通用U1U2U3算子;

所有算子都有逆版本,通过.dgr()方法访问

use qvnt::prelude::*;

let usual_op = op::s(0b1);
//  Inverse S operator
let inverse_op = op::s(0b1).dgr();

此外,所有这些运算符都可以通过使用 .c(...) 方法转换为受控运算符

use qvnt::prelude::*;

let usual_op = op::x(0b001);
//  NOT gate, controlled by 2 qubits, aka CCNOT gate, aka Toffoli gate
let controlled_op = op::x(0b001).c(0b110).unwrap();

由于受控运算符可能与运算符的掩码重叠,因此需要解包。例如,此代码将导致 panic

use qvnt::prelude::*;
let _ = op::x(0b001).c(0b001).unwrap();

许可证

MIT 许可证 下授权

依赖项