如何计算(a / b)%c其中a,b和c是非常大的数字

时间:2014-11-09 05:32:40

标签: math numbers division modulo integer-division

我有一个功能
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)是a f(x-r)* f(r)是b。 c是一些非常大的数字。 `` 所以我怎么能算出(a/b)%c

1 个答案:

答案 0 :(得分:0)

  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为最后一个(不需要在子结果中)
    • 摆脱重复的热量
    • 有两个选项可以摆脱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. 一些数学调整

    • 你应该计算两个热量a,b(来自(a / b)%c)parallel
    • 当两者都可以被前几个素数中的任何一个分开时,然后将它们分开以保持低幅度
    • 类似::
    • `if((a& 1 == 0)&&(b& 1 == 0)){a>> = 1; B个;> = 1; } //除以prime = 2 ......这通常就足够了
    • 但是如果你的体重很大,那么你可能应该添加一些像3,5,7,......
    • 但总是测量性能下降,如果下降太多则停止
  4. 如果x很大且r很小

    • 然后先计算b
    • 和计算a
    • 除了素数之外,还检查子结果​​是否也可以被b
    • 整除
    • 如果是,则将a除以b并将结果添加到最终的分割结果
  5. 一些速度提升

    • 您可以计算部分a,b
    • 并且只有当展位的幅度大于某个阈值
    • 时才开始测试可分性
    • 你也可以让计算彼此等待
    • 所以,如果a>1000000,那么等到b也是如此大或整个
    • 并在反向中执行相同操作(如果b>100000 ....)
    • 更大的阈值是更好的速度,但是你受到整数实现的限制
    • 如果使用bigints,则应使用较小的阈值,然后将基数的位数减半...
  6. 希望我没有犯一些愚蠢的数学错误...