我的家庭作业,是提供了一个计算的功能,“X ^ÿ模N” - 对于任意n <(开方maxint32)国防部哈斯克尔作业
所以我就开始写这样做:
modPow :: Int -> Int -> Int -> Int
modPow x y n = (x `mod` n)^(y `mod` n) `mod` n
虽然我的下一个作业问题涉及到使用x^n mod n = x(Camichael数字),并且我永远无法使modPow工作,但似乎对任何数量的n都正常工作。
modPow2 :: Int -> Int -> Int -> Int
modPow2 x y n
= loopmod 1 1
where
loopmod count total = if count > y
then total
else loopmod (count+1) ((total*x) `mod` n)
现在正确地产生正确的答案我的下一个问题,(X^N模N = X) - 用于检查:
所以我使用伪代码对mod幂,维基百科 - 从另一个制成modPow为Camichael号码。
虽然modPow2不为“Y”的大数字工作(堆栈溢出!)
我怎么能调整modPow2,使其不再获得的情况下,Y> 10,000(但仍然是一个计算器小于sqrt 32的maxint 32-大约是46,000)
或者在我的原始modPow上有修复,所以它可以与x^n mod n = x一起使用? (我总是做560 561 561作为输入,这让我回1不是560(561是卡迈克尔数,以便应该给560回)
非常感谢。
得使用 '拥抱',对不起。 –
@Steven,看我的编辑 – Ingo
完美的作品,非常感谢!任何它为什么会起作用的原因 - 它如何强制拥抱? –