diff --git a/junction.py b/junction.py
new file mode 100644
index 0000000000000000000000000000000000000000..2fd908335aee80ec69cb86c524a221f5fc279b1f
--- /dev/null
+++ b/junction.py
@@ -0,0 +1,54 @@
+# Ryan McShane
+
+from qiskit import *
+
+
+def conjunction(circuit, q, L, R, T):
+ # Implements X1 /\ X3 /\ X5 /\ X6 = X7
+
+ circuit.ccx(q[0], q[1], q[T[0]])
+ tIndex = 0
+ lIndex = 2
+ circuit.barrier(q)
+ while lIndex < (len(L)-1):
+ circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[T[tIndex+1]])
+ lIndex += 1
+ tIndex += 1
+ circuit.barrier(q)
+ circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[R])
+ # Undo
+ while lIndex > 2:
+ lIndex -= 1
+ tIndex -= 1
+ circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[T[tIndex+1]])
+ circuit.barrier(q)
+ circuit.ccx(q[0], q[1], q[T[0]])
+
+def disjunction(circuit, q, L, R, T):
+ circuit.x(q[0])
+ circuit.x(q[1])
+ circuit.ccx(q[0], q[1], q[T[0]])
+ circuit.barrier(q)
+ tIndex = 0
+ lIndex = 2
+ while lIndex < (len(L) - 1):
+ circuit.x(q[L[lIndex]])
+ circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[T[tIndex + 1]])
+ lIndex += 1
+ tIndex += 1
+ circuit.barrier(q)
+ circuit.x(q[L[lIndex]])
+ circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[R])
+ circuit.x(q[R])
+
+ circuit.barrier(q)
+ # Undo
+ while lIndex > 2:
+ lIndex -= 1
+ tIndex -= 1
+ circuit.ccx(q[L[lIndex]], q[T[tIndex]], q[T[tIndex + 1]])
+ circuit.x(q[L[lIndex]])
+ circuit.barrier(q)
+ circuit.ccx(q[0], q[1], q[T[0]])
+ circuit.x(q[1])
+ circuit.x(q[0])
diff --git a/logic_gates.py b/logic_gates.py
index 740c5327a4b3822798f82bb19a85a9de2fdb715a..7e367a0660cb1c0763a8fff90d3f2d9e10da3ea6 100644
--- a/logic_gates.py
+++ b/logic_gates.py
@@ -1,11 +1,11 @@
# Ryan McShane
# Logic Gates Modules
- # AND, OR, XOR, NAND, NOR, XNOR
-def and(circuit, A, B, result):
+# AND, OR, XOR, NAND, NOR, XNOR
+def AND(circuit, q, A, B, result):
circuit.ccx(q[A], q[B], q[result])
-def or(circuit, A, B, result):
+def OR(circuit, q, A, B, result):
circuit.x(q[A])
circuit.x(q[B])
circuit.ccx(q[result])
@@ -14,36 +14,40 @@ def or(circuit, A, B, result):
circuit.x(q[B])
circuit.x(q[A])
-def nand(circuit, A, B, result):
+
+def NAND(circuit, q, A, B, result):
circuit.ccx(q[A], q[B], q[result])
circuit.x(q[result])
-def nor(circuit, A, B, result):
+
+def NOR(circuit, q, A, B, result):
circuit.x(q[A])
circuit.x(q[B])
circuit.ccx(q[result])
-
+ # Undo
circuit.x(q[B])
circuit.x(q[A])
-def xor(circuit, A, B, result, t1, t2, t3):
- nand(circuit, q[A], q[B], q[t1])
+
+def XOR(circuit, q, A, B, result, t1, t2, t3):
+ NAND(circuit, q[A], q[B], q[t1])
circuit.x(q[t1])
- nand(circuit, q[A], q[t1], q[t2])
+ NAND(circuit, q[A], q[t1], q[t2])
circuit.x(q[t2])
- nand(circuit, q[B], q[t1], q[t3])
+ NAND(circuit, q[B], q[t1], q[t3])
circuit.x(q[t3])
- nand(circuit, q[t2], q[t3], q[result])
+ NAND(circuit, q[t2], q[t3], q[result])
circuit.x(q[result])
-
+ # Undo
circuit.x(q[t3])
- nand(circuit, q[B], q[t1], q[t3])
+ NAND(circuit, q[B], q[t1], q[t3])
circuit.x(q[t2])
- nand(circuit, q[A], q[t1], q[t2])
+ NAND(circuit, q[A], q[t1], q[t2])
circuit.x(q[t1])
- nand(circuit, q[A], q[B], q[t1])
+ NAND(circuit, q[A], q[B], q[t1])
-def xnor(circuit, a, b, result, R, At, Bt):
- xor(circuit, a, b, result, R, At, Bt)
- circuit.x(q[result])
+def XNOR(circuit, q, a, b, result, R, At, Bt):
+ # circuit, q = quantum register, a, b, result, R = first NAND, At=second NAND, Bt = third NAND
+ XOR(circuit, a, b, result, R, At, Bt)
+ circuit.x(q[result]) # Just XOR negated