Add support for scaling numbers by primitive types.

This commit is contained in:
2019-01-01 20:50:09 -08:00
parent 69312c6a42
commit 4114db21be
68 changed files with 184563 additions and 0 deletions

View File

@@ -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 [] []

View File

@@ -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))
])

View File

@@ -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)