Add support for scaling numbers by primitive types.
This commit is contained in:
@@ -60,6 +60,7 @@ main = do
|
||||
ModMul -> hPutStrLn hndl ("modmul_impls!(U" ++ show size ++ ", U" ++ show (size * 2) ++ ", BarrettU" ++ show size ++ ");")
|
||||
ModSq -> hPutStrLn hndl ("modsq_impls!(U" ++ show size ++ ", U" ++ show (size * 2) ++ ", BarrettU" ++ show size ++ ");")
|
||||
Mul -> hPutStrLn hndl ("multiply_impls!(U" ++ show size ++ ", U" ++ show (size * 2) ++ ");")
|
||||
Scale -> hPutStrLn hndl ("scale_impls!(U" ++ show size ++ ", U" ++ show (size + 64) ++ ");")
|
||||
Shifts -> hPutStrLn hndl ("shift_impls!(U" ++ show size ++ ", " ++ show (size `div` 64) ++ ");")
|
||||
Square -> hPutStrLn hndl ("square_impls!(U" ++ show size ++ ", U" ++ show (size * 2) ++ ", " ++ show size ++ ");")
|
||||
SquareRoot -> hPutStrLn hndl ("sqrt_impls!(U" ++ show size ++ ");")
|
||||
@@ -79,6 +80,7 @@ main = do
|
||||
generateTestBlock hndl "shiftr" Shifts True 9000 []
|
||||
generateTestBlock hndl "add" Add True 9000 [(+ 64)]
|
||||
generateTestBlock hndl "mul" Mul True 9000 [(* 2)]
|
||||
generateTestBlock hndl "scale" Scale True 9000 [(+ 64)]
|
||||
generateTestBlock hndl "div" Div True 2049 []
|
||||
generateTestBlock hndl "barrett_gen" Barretts True 2000 [(+ 64)]
|
||||
generateTestBlock hndl "barrett_red" Barretts True 4000 [(+ 64), (* 2)]
|
||||
@@ -102,6 +104,7 @@ main = do
|
||||
SignedMul -> hPutStrLn hndl ("mul_impls!(I" ++ show size ++ ", I" ++ show (size * 2) ++ ");")
|
||||
SignedDiv -> hPutStrLn hndl ("div_impls!(I" ++ show size ++ ", U" ++ show size ++ ");")
|
||||
SignedModInv -> hPutStrLn hndl ("smodinv_impls!(I" ++ show size ++ ", I" ++ show (size + 64) ++ ");")
|
||||
SignedScale -> hPutStrLn hndl ("scale_impls!(I" ++ show size ++ ", I" ++ show (size + 64) ++ ");")
|
||||
EGCD -> hPutStrLn hndl ("egcd_impls!(I" ++ show (size + 64) ++ ", U" ++ show size ++ ", I" ++ show size ++ ", I" ++ show ((size + 64) * 2) ++ ");")
|
||||
ModDiv -> hPutStrLn hndl ("moddiv_impls!(I" ++ show size ++ ", I" ++ show (size * 2) ++ ");")
|
||||
ModInv -> hPutStrLn hndl ("modinv_impls!(U" ++ show size ++ ", I" ++ show (size + 64) ++ ", U" ++ show (size + 64) ++ ");")
|
||||
@@ -119,6 +122,7 @@ main = do
|
||||
generateSigTestBlock hndl "sigdiv" SignedDiv True 2049 [] []
|
||||
generateSigTestBlock hndl "sigshiftl" SignedShift True 16384 [] []
|
||||
generateSigTestBlock hndl "sigshiftr" SignedShift True 16384 [] []
|
||||
generateSigTestBlock hndl "sigscale" SignedScale True 16384 [(+ 64)] [(+ 64)]
|
||||
generateSigTestBlock hndl "egcd" EGCD True 1024 [(+ 64)] [(+ 64)]
|
||||
generateSigTestBlock hndl "moddiv" ModDiv True 2048 [] []
|
||||
generateSigTestBlock hndl "modinv" ModInv True 2048 [] []
|
||||
|
||||
@@ -16,6 +16,7 @@ data Operation = Add
|
||||
| ModMul
|
||||
| ModSq
|
||||
| Mul
|
||||
| Scale
|
||||
| Shifts
|
||||
| Square
|
||||
| Sub
|
||||
@@ -28,6 +29,7 @@ data Operation = Add
|
||||
| SignedMul
|
||||
| SignedDiv
|
||||
| SignedModInv
|
||||
| SignedScale
|
||||
| SigConvert Int
|
||||
| SquareRoot
|
||||
| EGCD
|
||||
@@ -136,9 +138,11 @@ needs = [ Need RSA (\ size -> [Req (size `div` 2) Sub,
|
||||
Req size (Convert (size + 64))
|
||||
])
|
||||
, Need Mul (\ size -> [Req size BaseOps,
|
||||
Req size Scale,
|
||||
Req (size * 2) BaseOps,
|
||||
Req size (Convert (size * 2))
|
||||
])
|
||||
, Need Scale (\ size -> [Req (size + 64) BaseOps])
|
||||
, Need Shifts (\ size -> [Req size BaseOps
|
||||
])
|
||||
, Need Square (\ size -> [Req size BaseOps,
|
||||
@@ -167,6 +171,7 @@ needs = [ Need RSA (\ size -> [Req (size `div` 2) Sub,
|
||||
Req size (SigConvert (size + 64))
|
||||
])
|
||||
, Need SignedMul (\ size -> [Req size Mul,
|
||||
Req size SignedScale,
|
||||
Req (size * 2) SignedBase,
|
||||
Req size (SigConvert (size * 2))
|
||||
])
|
||||
|
||||
@@ -29,6 +29,7 @@ testDatabase = [
|
||||
(ModMul, "modmul", "modular multiplication", modmulTest),
|
||||
(ModSq, "modsq", "modular square", modsqTest),
|
||||
(Mul, "mul", "unsigned multiplication", mulTest),
|
||||
(Scale, "scale", "unsigned scaling", scaleTest),
|
||||
(Shifts, "shiftl", "unsigned shift left", shiftlTest),
|
||||
(Shifts, "shiftr", "unsigned shift right", shiftrTest),
|
||||
(Square, "square", "unsigned squaring", squareTest),
|
||||
@@ -37,6 +38,7 @@ testDatabase = [
|
||||
(SignedBase, "signed", "signed base", signedTest),
|
||||
(SignedCmp, "sigcmp", "signed compare", sigcmpTest),
|
||||
(SignedMul, "sigmul", "signed multiply", sigmulTest),
|
||||
(SignedScale, "sigscale", "signed scaling", sigscaleTest),
|
||||
(SignedDiv, "sigdiv", "signed division", sigdivTest),
|
||||
(SignedModInv,"smodinv", "signed modular inversion",smodinvTest),
|
||||
(SignedShift, "sigshiftr", "signed shift right", sigshiftrTest),
|
||||
@@ -329,3 +331,22 @@ smodinvTest size memoryIn =
|
||||
assert ((a * c) `mod` b == 1) $
|
||||
(res, c, memory2)
|
||||
in attempt memoryIn
|
||||
|
||||
scaleTest :: Test
|
||||
scaleTest size memory0 =
|
||||
let (a, memory1) = generateNum memory0 "a" size
|
||||
(b, memory2) = generateNum memory1 "b" 64
|
||||
c = a * b
|
||||
res = Map.fromList [("a", showX a), ("b", showX b),
|
||||
("c", showX c)]
|
||||
in (res, c, memory2)
|
||||
|
||||
|
||||
sigscaleTest :: Test
|
||||
sigscaleTest size memory0 =
|
||||
let (a, memory1) = genSign (generateNum memory0 "a" size)
|
||||
(b, memory2) = genSign (generateNum memory1 "b" 63)
|
||||
c = a * b
|
||||
res = Map.fromList [("a", showX a), ("b", showX b),
|
||||
("c", showX c)]
|
||||
in (res, c, memory2)
|
||||
Reference in New Issue
Block a user