Skip to content

Commit db8b993

Browse files
create DirtyOutOfPlaceMontgomeryModMul (#1395)
* create DirtyOutOfPlaceMontgomeryModMul * reduce test size * Use QROAMClean instead of QROM and address comments * fix conflicts * generate notebooks * fix typo * fix validation logic * nit * fix validation * address comments and add tests for SingleWindowModMul * address comments --------- Co-authored-by: Tanuj Khattar <tanujkhattar@google.com>
1 parent 0f4deee commit db8b993

File tree

8 files changed

+796
-65
lines changed

8 files changed

+796
-65
lines changed

dev_tools/autogenerate-bloqs-notebooks-v2.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,7 @@
524524
bloq_specs=[
525525
qualtran.bloqs.mod_arithmetic.mod_multiplication._MOD_DBL_DOC,
526526
qualtran.bloqs.mod_arithmetic.mod_multiplication._C_MOD_MUL_K_DOC,
527+
qualtran.bloqs.mod_arithmetic.mod_multiplication._DIRTY_OUT_OF_PLACE_MONTGOMERY_MOD_MUL_DOC,
527528
],
528529
),
529530
NotebookSpecV2(

qualtran/bloqs/factoring/ecc/ec_add.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,17 @@
1818

1919
from qualtran import Bloq, bloq_example, BloqDocSpec, QUInt, Register, Signature
2020
from qualtran.bloqs.arithmetic._shims import MultiCToffoli
21-
from qualtran.bloqs.mod_arithmetic import CModAdd, CModNeg, CModSub, ModAdd, ModNeg, ModSub
22-
from qualtran.bloqs.mod_arithmetic._shims import ModDbl, ModInv, ModMul
21+
from qualtran.bloqs.mod_arithmetic import (
22+
CModAdd,
23+
CModNeg,
24+
CModSub,
25+
DirtyOutOfPlaceMontgomeryModMul,
26+
ModAdd,
27+
ModDbl,
28+
ModNeg,
29+
ModSub,
30+
)
31+
from qualtran.bloqs.mod_arithmetic._shims import ModInv
2332
from qualtran.resource_counting import BloqCountDictT, SympySymbolAllocator
2433

2534

@@ -63,7 +72,7 @@ def signature(self) -> 'Signature':
6372
]
6473
)
6574

66-
def build_call_graph(self, ssa: 'SympySymbolAllocator') -> 'BloqCountDictT':
75+
def build_call_graph(self, ssa: 'SympySymbolAllocator') -> BloqCountDictT:
6776
# litinksi
6877
return {
6978
MultiCToffoli(n=self.n): 18,
@@ -74,7 +83,7 @@ def build_call_graph(self, ssa: 'SympySymbolAllocator') -> 'BloqCountDictT':
7483
ModNeg(QUInt(self.n), mod=self.mod): 2,
7584
CModNeg(QUInt(self.n), mod=self.mod): 1,
7685
ModDbl(QUInt(self.n), mod=self.mod): 2,
77-
ModMul(n=self.n, mod=self.mod): 10,
86+
DirtyOutOfPlaceMontgomeryModMul(bitsize=self.n, window_size=4, mod=self.mod): 10,
7887
ModInv(n=self.n, mod=self.mod): 4,
7988
}
8089

qualtran/bloqs/mod_arithmetic/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from ._shims import ModInv, ModMul
15+
from ._shims import ModInv
1616
from .mod_addition import CModAdd, CModAddK, CtrlScaleModAdd, ModAdd, ModAddK
17-
from .mod_multiplication import CModMulK, ModDbl
17+
from .mod_multiplication import CModMulK, DirtyOutOfPlaceMontgomeryModMul, ModDbl
1818
from .mod_subtraction import CModNeg, CModSub, ModNeg, ModSub

qualtran/bloqs/mod_arithmetic/_shims.py

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
from qualtran.bloqs.basic_gates import CNOT, CSwap, Swap, Toffoli
3333
from qualtran.bloqs.mod_arithmetic.mod_multiplication import ModDbl
3434
from qualtran.drawing import Text, TextBox, WireSymbol
35-
from qualtran.symbolics import ceil, log2
3635

3736
if TYPE_CHECKING:
3837
from qualtran.resource_counting import BloqCountDictT, SympySymbolAllocator
@@ -114,37 +113,3 @@ def wire_symbol(
114113
elif reg.name == 'out':
115114
return TextBox('$x^{-1}$')
116115
raise ValueError(f'Unrecognized register name {reg.name}')
117-
118-
119-
@frozen
120-
class ModMul(Bloq):
121-
n: int
122-
mod: int
123-
124-
@cached_property
125-
def signature(self) -> 'Signature':
126-
return Signature(
127-
[
128-
Register('x', QUInt(self.n)),
129-
Register('y', QUInt(self.n)),
130-
Register('out', QUInt(self.n)),
131-
]
132-
)
133-
134-
def build_call_graph(self, ssa: 'SympySymbolAllocator') -> 'BloqCountDictT':
135-
# Roetteler montgomery
136-
return {Toffoli(): ceil(16 * self.n**2 * log2(self.n) - 26.3 * self.n**2)}
137-
138-
def wire_symbol(
139-
self, reg: Optional['Register'], idx: Tuple[int, ...] = tuple()
140-
) -> 'WireSymbol':
141-
if reg is None:
142-
return Text("")
143-
if reg.name in ['x', 'y']:
144-
return TextBox(reg.name)
145-
elif reg.name == 'out':
146-
return TextBox('x*y')
147-
raise ValueError(f'Unrecognized register name {reg.name}')
148-
149-
def __str__(self):
150-
return self.__class__.__name__

0 commit comments

Comments
 (0)