Qrack  9.13
General classical-emulating-quantum development framework
qalu.hpp
Go to the documentation of this file.
1 //
3 // (C) Daniel Strano and the Qrack contributors 2017-2023. All rights reserved.
4 //
5 // This is a multithreaded, universal quantum register simulation, allowing
6 // (nonphysical) register cloning and direct measurement of probability and
7 // phase, to leverage what advantages classical emulation of qubits can have.
8 //
9 // Licensed under the GNU Lesser General Public License V3.
10 // See LICENSE.md in the project root or https://www.gnu.org/licenses/lgpl-3.0.en.html
11 // for details.
12 
13 #pragma once
14 
16 
17 namespace Qrack {
18 
19 class QAlu;
20 typedef std::shared_ptr<QAlu> QAluPtr;
21 
22 class QAlu {
23 public:
24  virtual bool M(bitLenInt qubitIndex) = 0;
25  virtual void X(bitLenInt qubitIndex) = 0;
26 
34  virtual void PhaseFlipIfLess(const bitCapInt& greaterPerm, bitLenInt start, bitLenInt length) = 0;
36  virtual void CPhaseFlipIfLess(
37  const bitCapInt& greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex) = 0;
38 
40  virtual void INC(const bitCapInt& toAdd, bitLenInt start, bitLenInt length) = 0;
42  virtual void DEC(const bitCapInt& toSub, bitLenInt start, bitLenInt length) = 0;
44  virtual void CINC(
45  const bitCapInt& toAdd, bitLenInt start, bitLenInt length, const std::vector<bitLenInt>& controls) = 0;
47  virtual void CDEC(
48  const bitCapInt& toSub, bitLenInt start, bitLenInt length, const std::vector<bitLenInt>& controls);
50  virtual void INCC(const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
52  virtual void DECC(const bitCapInt& toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
54  virtual void INCDECC(const bitCapInt& toMod, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
56  virtual void INCS(const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex) = 0;
58  virtual void DECS(const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex) = 0;
60  virtual void INCSC(
61  const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex);
63  virtual void INCSC(const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
65  virtual void DECSC(
66  const bitCapInt& toSub, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex);
68  virtual void DECSC(const bitCapInt& toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
70  virtual void INCDECSC(const bitCapInt& toMod, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
72  virtual void INCDECSC(
73  const bitCapInt& toMod, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex) = 0;
75  virtual void MUL(const bitCapInt& toMul, bitLenInt start, bitLenInt carryStart, bitLenInt length) = 0;
77  virtual void DIV(const bitCapInt& toDiv, bitLenInt start, bitLenInt carryStart, bitLenInt length) = 0;
79  virtual void MULModNOut(
80  const bitCapInt& toMul, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length) = 0;
82  virtual void IMULModNOut(
83  const bitCapInt& toMul, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length) = 0;
85  virtual void POWModNOut(
86  const bitCapInt& base, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length) = 0;
88  virtual void CMUL(const bitCapInt& toMul, bitLenInt start, bitLenInt carryStart, bitLenInt length,
89  const std::vector<bitLenInt>& controls) = 0;
91  virtual void CDIV(const bitCapInt& toDiv, bitLenInt start, bitLenInt carryStart, bitLenInt length,
92  const std::vector<bitLenInt>& controls) = 0;
94  virtual void CMULModNOut(const bitCapInt& toMul, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart,
95  bitLenInt length, const std::vector<bitLenInt>& controls) = 0;
97  virtual void CIMULModNOut(const bitCapInt& toMul, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart,
98  bitLenInt length, const std::vector<bitLenInt>& controls) = 0;
100  virtual void CPOWModNOut(const bitCapInt& base, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart,
101  bitLenInt length, const std::vector<bitLenInt>& controls) = 0;
102 
103 #if ENABLE_BCD
105  virtual void INCBCD(const bitCapInt& toAdd, bitLenInt start, bitLenInt length) = 0;
107  virtual void DECBCD(const bitCapInt& toSub, bitLenInt start, bitLenInt length);
109  virtual void INCDECBCDC(const bitCapInt& toMod, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
110 #endif
111 
170  virtual bitCapInt IndexedLDA(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
171  bitLenInt valueLength, const unsigned char* values, bool resetValue = true) = 0;
199  virtual bitCapInt IndexedADC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
200  bitLenInt valueLength, bitLenInt carryIndex, const unsigned char* values) = 0;
228  virtual bitCapInt IndexedSBC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
229  bitLenInt valueLength, bitLenInt carryIndex, const unsigned char* values) = 0;
236  virtual void Hash(bitLenInt start, bitLenInt length, const unsigned char* values) = 0;
237 
238 #if ENABLE_BCD
239 
241  virtual void INCBCDC(const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
242 
244  virtual void DECBCDC(const bitCapInt& toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
245 #endif
246 
248 };
249 } // namespace Qrack
Definition: qalu.hpp:22
virtual bool M(bitLenInt qubitIndex)=0
virtual void X(bitLenInt qubitIndex)=0
virtual void INCS(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)=0
Add a classical integer to the register, with sign and without carry.
virtual void INCDECSC(const bitCapInt &toMod, bitLenInt start, bitLenInt length, bitLenInt carryIndex)=0
Common driver method behind INCSC and DECSC (without overflow flag)
virtual void IMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)=0
Inverse of multiplication modulo N by integer, (out of place)
virtual void INCDECBCDC(const bitCapInt &toMod, bitLenInt start, bitLenInt length, bitLenInt carryIndex)=0
Common driver method behind INCSC and DECSC (without overflow flag)
virtual void CINC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, const std::vector< bitLenInt > &controls)=0
Add integer (without sign, with controls)
virtual bitCapInt IndexedSBC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, bitLenInt carryIndex, const unsigned char *values)=0
Subtract from an entangled 8 bit register state with a superposed index-offset-based read from classi...
virtual bitCapInt IndexedLDA(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, const unsigned char *values, bool resetValue=true)=0
Set 8 bit register bits by a superposed index-offset-based read from classical memory.
virtual void INCC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Add integer (without sign, with carry)
Definition: qalu.cpp:46
virtual void DECS(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)=0
Add a classical integer to the register, with sign and without carry.
Definition: qalu.cpp:40
virtual void DECSC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
Subtract a classical integer from the register, with sign and with carry.
Definition: qalu.cpp:98
virtual void CDIV(const bitCapInt &toDiv, bitLenInt start, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)=0
Controlled division by power of integer.
virtual void Hash(bitLenInt start, bitLenInt length, const unsigned char *values)=0
Transform a length of qubit register via lookup through a hash table.
virtual void POWModNOut(const bitCapInt &base, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)=0
Raise a classical base to a quantum power, modulo N, (out of place)
virtual void CPhaseFlipIfLess(const bitCapInt &greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex)=0
The 6502 uses its carry flag also as a greater-than/less-than flag, for the CMP operation.
virtual void INCBCD(const bitCapInt &toAdd, bitLenInt start, bitLenInt length)=0
Add classical BCD integer (without sign)
virtual void INCBCDC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Add classical BCD integer (without sign, with carry)
Definition: qalu.cpp:157
virtual void INCDECSC(const bitCapInt &toMod, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)=0
Common driver method behind INCSC and DECSC (with overflow flag)
virtual bitCapInt IndexedADC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, bitLenInt carryIndex, const unsigned char *values)=0
Add to entangled 8 bit register state with a superposed index-offset-based read from classical memory...
virtual void DECBCD(const bitCapInt &toSub, bitLenInt start, bitLenInt length)
Subtract classical BCD integer (without sign)
Definition: qalu.cpp:150
virtual void INCDECC(const bitCapInt &toMod, bitLenInt start, bitLenInt length, bitLenInt carryIndex)=0
Common driver method behind INCC and DECC (without sign, with carry)
virtual void MULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)=0
Multiplication modulo N by integer, (out of place)
virtual void INCSC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
Add a classical integer to the register, with sign and with carry.
Definition: qalu.cpp:81
virtual void DECBCDC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Subtract BCD integer (without sign, with carry)
Definition: qalu.cpp:169
virtual void DEC(const bitCapInt &toSub, bitLenInt start, bitLenInt length)=0
Add integer (without sign)
Definition: qalu.cpp:22
virtual void MUL(const bitCapInt &toMul, bitLenInt start, bitLenInt carryStart, bitLenInt length)=0
Multiply by integer.
virtual void CPOWModNOut(const bitCapInt &base, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)=0
Controlled, raise a classical base to a quantum power, modulo N, (out of place)
virtual void CMUL(const bitCapInt &toMul, bitLenInt start, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)=0
Controlled multiplication by integer.
virtual void INC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length)=0
Add integer (without sign)
virtual void DIV(const bitCapInt &toDiv, bitLenInt start, bitLenInt carryStart, bitLenInt length)=0
Divide by integer.
virtual void CMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)=0
Controlled multiplication modulo N by integer, (out of place)
virtual void PhaseFlipIfLess(const bitCapInt &greaterPerm, bitLenInt start, bitLenInt length)=0
This is an expedient for an adaptive Grover's search for a function's global minimum.
virtual void CIMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)=0
Inverse of controlled multiplication modulo N by integer, (out of place)
virtual void CDEC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, const std::vector< bitLenInt > &controls)
Subtract integer (without sign, with controls)
Definition: qalu.cpp:29
virtual void DECC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Subtract classical integer (without sign, with carry)
Definition: qalu.cpp:62
GLOSSARY: bitLenInt - "bit-length integer" - unsigned integer ID of qubit position in register bitCap...
Definition: complex16x2simd.hpp:25
std::shared_ptr< QAlu > QAluPtr
Definition: qalu.hpp:19
#define bitLenInt
Definition: qrack_types.hpp:38
#define bitCapInt
Definition: qrack_types.hpp:62