【问题标题】: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】:
  1. 您的 f(x) 只是 ᴨ(PI 累积乘法)的平方

    • 这里很难写,所以我将定义 g(x0,x1) 代替
    • g(x0,x1)=x0*(x0+1)*(x0+2)*...*x1
    • 所以:
    • f(x)=g(1,x)^2
  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
  3. 一些数学调整

    • 您应该并行计算两个 therms a,b(来自 (a/b)%c)
    • 当两者都可以除以前几个素数中的任何一个时,然后将它们分开以保持较低的幅度
    • 类似::
    • `如果 ((a&1==0)&&(b&1==0)) { a>>=1; b>>=1; } // 除以素数 = 2 ... 这通常就足够了
    • 但如果您的震级非常大,那么您可能应该添加一些像 3,5,7,...
    • 但始终测量性能下降并在下降过多时停止
  4. 如果x 很大而r 很小

    • 然后先计算b
    • 在计算时a
    • 除了质数之外,还要检查子结果​​是否也能被b整除
    • 如果是则将a除以b并将结果添加到最终除法结果中
  5. 一些速度提升

    • 你可以计算部分a,b
    • 只有在展位的数量级大于某个阈值时才开始测试可分性
    • 你也可以让计算互相等待
    • 所以如果a>1000000 然后等到b 也这么大或完整
    • 并在反向时也这样做(如果b>100000 ....)
    • 阈值越大速度越快,但您会受到整数实现的限制
    • 如果使用 bigint,则应使用更小的阈值,然后将基数的位减半 ...

希望我没有犯一些愚蠢的数学错误......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多