作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
为了好玩,我正在尝试编写一个用于快速检查的属性,以测试 cryptography with RSA 背后的基本思想。 .
p
和 q
. N = p*q
e
是某个数字relatively prime至(p-1)(q-1)
(实际上,对于快速编码,e 通常为 3)d
是 modular inverse的 e
模 (p-1)(q-1)
x
这样
1 < x < N
,
(x^e)^d = x modulo N
总是正确的
x
是“消息”,将其提升到
e
次幂模组
N
是“编码”消息的行为,并将编码的消息提升到
d
次幂模组
N
是“解码”它的行为。
x = 1
也是微不足道的,这种情况是它自己的加密)
import Test.QuickCheck
-- modular exponentiation
modExp :: Integral a => a -> a -> a -> a
modExp y z n = modExp' (y `mod` n) z `mod` n
where modExp' y z | z == 0 = 1
| even z = modExp (y*y) (z `div` 2) n
| odd z = (modExp (y*y) (z `div` 2) n) * y
-- relatively prime
rPrime :: Integral a => a -> a -> Bool
rPrime a b = gcd a b == 1
-- multiplicative inverse (modular)
mInverse :: Integral a => a -> a -> a
mInverse 1 _ = 1
mInverse x y = (n * y + 1) `div` x
where n = x - mInverse (y `mod` x) x
-- just a quick way to test for primality
n `divides` x = x `mod` n == 0
primes = 2:filter isPrime [3..]
isPrime x = null . filter (`divides` x) $ takeWhile (\y -> y*y <= x) primes
-- the property
prop_rsa (p,q,x) = isPrime p &&
isPrime q &&
p /= q &&
x > 1 &&
x < n &&
rPrime e t ==>
x == (x `powModN` e) `powModN` d
where e = 3
n = p*q
t = (p-1)*(q-1)
d = mInverse e t
a `powModN` b = modExp a b n
(感谢 google 和随机博客提供
implementation of modular multiplicative inverse )
quickCheck prop_rsa
在 ghci 中使我的终端挂起。
Properties may take the form
forAll <generator> $ \<pattern> -> <property>
<generator>
对于素数?或与其他约束条件,使
quickCheck
不必筛选一堆失败的条件?
最佳答案
这是制作兼容 QuickCheck 的素数生成器的一种方法(从 http://en.literateprograms.org/Sieve_of_Eratosthenes_(Haskell 中窃取 Eratosthenes 的筛子实现)):
import Test.QuickCheck
newtype Prime = Prime Int deriving Show
primes = sieve [2..]
where
sieve (p:xs) = Prime p : sieve [x | x <- xs, x `mod` p > 0]
instance Arbitrary Prime where
arbitrary = do i <- arbitrary
return $ primes!!(abs i)
prop_primes_dont_divide (Prime x) (Prime y) = x == y || x `mod` y > 0
p
和
q
与
(Prime p)
和
(Prime q)
在您的属性(property)中。
关于haskell - 通过生成素数使用 QuickCheck,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055298/
我是一名优秀的程序员,十分优秀!