aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/quantum_components.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/core/quantum_components.c b/src/core/quantum_components.c
new file mode 100644
index 0000000..3b9eef5
--- /dev/null
+++ b/src/core/quantum_components.c
@@ -0,0 +1,51 @@
+#include "core/quantum_components.h"
+
+#include <assert.h>
+
+struct PsiVector psi_new_state_0(void)
+{
+ return psi_column_vector(psi_new_complex(1.0, 0.0), psi_new_complex(0.0, 0.0));
+}
+
+struct PsiVector psi_new_state_1(void)
+{
+ return psi_column_vector(psi_new_complex(0.0, 0.0), psi_new_complex(1.0, 0.0));
+}
+
+struct PsiQuantumGate psi_new_quantum_gate(const char *name, struct PsiMatrix matrix, size_t num_qubits)
+{
+ size_t expected_dim = (size_t)1 << num_qubits;
+ assert(matrix.rows == expected_dim);
+ assert(matrix.cols == expected_dim);
+
+ return (struct PsiQuantumGate)
+ {
+ name,
+ matrix,
+ num_qubits,
+ };
+}
+
+struct PsiQuantumGate psi_new_quantum_gate_from_matrix(const char *name, struct PsiMatrix matrix)
+{
+ assert(matrix.rows == matrix.cols);
+
+ size_t dim = matrix.rows;
+ assert(dim > 0 && (dim & (dim - 1)) == 0);
+
+ size_t num_qubits = 0;
+ while (((size_t)1 << num_qubits) < dim)
+ num_qubits++;
+
+ return (struct PsiQuantumGate)
+ {
+ name,
+ matrix,
+ num_qubits,
+ };
+}
+
+void psi_free_quantum_gate(struct PsiQuantumGate *gate)
+{
+ psi_free_matrix(&gate->matrix);
+}