set allow-redefines 1;
// pseudo classic operator to swap bit order
qufunct flip(qureg q) {
int i; // declare loop counter
for i=0 to #q/2-1 { // swap 2 symmetric bits
Swap(q[i],q[#q-i-1]);
}
}
// Conditional Xor
qufunct cxor(quconst a,qureg b,quconst e) {
int i;
for i=0 to #a-1 {
CNot(b[i],a[i] & e);
}
}
// Conditional multiplexed binary adder for one of 2 classical
// bits and 1 qubit.
// Full adder if #sum=2, half adder if #sum=1.
qufunct muxaddbit(boolean a0,boolean a1,quconst sel,
quconst b,qureg sum,quconst e) {
qureg s=sel; // redeclare sel as qureg
if (a0 xor a1) { // a0 and a1 differ?
if a0 { Not(s); } // write a into sect qubit
if #sum>1 { // set carry if available
CNot(sum[1],sum[0] & s & e);
}
CNot(sum[0],s & e); // add a
if a0 { Not(s); } // restore sect qubit
} else {
if a0 and a1 {
if #sum>1 { // set carry if available
CNot(sum[1],sum[0] & e);
}
CNot(sum[0],e); // add a
}
};
// Add qubit b
if #sum>1 { // set carry if available
CNot(sum[1],b & sum[0]);
}
CNot(sum[0],b); // add b
}
// conditional multiplexed binary adder for one of 2 integers
// and 1 qureg. No output carry.
qufunct muxadd(int a0,int a1,qureg sel,quconst b,quvoid sum,quconst e) {
int i;
for i=0 to #b-2 { // fulladd first #b-1 bits
muxaddbit(bit(a0,i),bit(a1,i),sel,b[i],sum[i:i+1],e);
}
// half add last bit
muxaddbit(bit(a0,#b-1),bit(a1,#b-1),sel,b[#b-1],sum[#b-1],e);
}
// Comparison operator. flag is toggled if b<a.
// b gets overwritten. Needs a #b-1 qubit junk register j
// as argument which is left dirty.
qufunct lt(int a,qureg b,qureg flag,quvoid j) {
int i;
if bit(a,#b-1) { // disable further comparison
CNot(j[#b-2],b[#b-1]); // and set result flag if
Not(b[#b-1]); // MSB(a)>MSB(b)
CNot(flag,b[#b-1]);
} else {
Not(b[#b-1]); // disable further comparison
CNot(j[#b-2],b[#b-1]); // if MSB(a)<MSB(b)
}
for i=#b-2 to 1 step -1 { // continue for lower bits
if bit(a,i) { // set new junk bit if undecided
CNot(j[i-1],j[i] & b[i]);
Not(b[i]); // honor last junk bit and
CNot(flag,j[i] & b[i]); // set result flag if a[i]>b[i]
} else {
Not(b[i]);
CNot(j[i-1],j[i] & b[i]);
}
}
if bit(a,0) {
Not(b[0]); // if still undecided (j[0]=1)
CNot(flag,j[0] & b[0]); // result is LSB(a)>LSB(b)
}
}
set allow-redefines 0;