【问题标题】:How to Calculate (a/b) %c where a,b and c are very large numbers [closed]如何计算(a / b)%c,其中a,b和c是非常大的数字[关闭]
【发布时间】:2014-11-09 05:32:39
【问题描述】:
我有一个函数
f(x)=(1^1)*(2^2)*(3^3)*.....(x^x)
我必须计算(f(x)/(f(x-r)*f(r)))modulo c
我可以计算 f(x) 和 (f(x-r)*f(r))。
假设 f(x) 是
f(x-r)*f(r) 是 b。
c 是一个非常大的数字。 ``
所以我怎么计算(a/b)%c
【问题讨论】:
标签:
math
numbers
division
modulo
integer-division
【解决方案1】:
-
您的 f(x) 只是 ᴨ(PI 累积乘法)的平方
- 这里很难写,所以我将定义 g(x0,x1) 代替
g(x0,x1)=x0*(x0+1)*(x0+2)*...*x1
- 所以:
f(x)=g(1,x)^2
-
计算h(x,r,c)=f(x)/(f(x-r)*f(r))%c
- 当您将其重写为 g() 时,您会得到:
h(x,r,c)=((g(1,x)/(g(1,x-r)*g(1,r)))^2)%c
- 现在尽可能简化(并降低幅度)
- 所以最后计算
sqr(不需要子结果)
- 摆脱重复的therms
- 有两个选项摆脱
g(1,x-r)或g(1,r)
- 选择更适合你的我会选择更大的
- 所以如果
(x-r>r) 那么:
h(x,r,c)=(g(x-r+1,x)/g(1,r)^2)%c
- 其他:
h(x,r,c)=(g(r+1,x)/g(1,x-r)^2)%c
-
一些数学调整
- 您应该并行计算两个 therms a,b(来自 (a/b)%c)
- 当两者都可以除以前几个素数中的任何一个时,然后将它们分开以保持较低的幅度
- 类似::
- `如果 ((a&1==0)&&(b&1==0)) { a>>=1; b>>=1; } // 除以素数 = 2 ... 这通常就足够了
- 但如果您的震级非常大,那么您可能应该添加一些像 3,5,7,...
- 但始终测量性能下降并在下降过多时停止
-
如果x 很大而r 很小
- 然后先计算
b
- 在计算时
a
- 除了质数之外,还要检查子结果是否也能被
b整除
- 如果是则将
a除以b并将结果添加到最终除法结果中
-
一些速度提升
- 你可以计算部分
a,b
- 只有在展位的数量级大于某个阈值时才开始测试可分性
- 你也可以让计算互相等待
- 所以如果
a>1000000 然后等到b 也这么大或完整
- 并在反向时也这样做(如果
b>100000 ....)
- 阈值越大速度越快,但您会受到整数实现的限制
- 如果使用 bigint,则应使用更小的阈值,然后将基数的位减半 ...
希望我没有犯一些愚蠢的数学错误......