【问题标题】:Can this script have better performance using modular exponentiation?这个脚本可以使用模幂获得更好的性能吗?
【发布时间】:2020-05-05 20:42:41
【问题描述】:
def f(a, b, c):
    return ((a ** b)-1) // c % b

这个脚本可以在某种程度上更快吗? (我一直在寻找具有模幂运算的东西):

pow(a, b, c) == a ** b % c

但是上面的这个脚本似乎不能像那样改进。有谁知道加快上述脚本的方法?提前致谢。

编辑:

第二个脚本和第一个完全不一样,只是为了说明我想到了什么样的优化。

编辑:

我没有输入确切的方程式,因为我想要一个通用的案例解决方案, 具体是当 a = 4 和 c = 3 时。这样会更容易吗?

编辑:

我得到了明确的要求,如果我想先减法,或者我想先求幂,我想先进行求幂,我通过添加括号来明确。

【问题讨论】:

  • 将每个案例运行一百万次,看看差异
  • @DYZ 但他只有 一个 实现。您是否忽略了他所询问的// c
  • 鉴于在座的几乎每个人都误解了这个问题并忽略了您真正要问的问题,如果您编辑问题以使其清楚,那将是很好的。
  • 这真的是你程序的瓶颈吗?如果是这样,你应该考虑使用numpy,如果你有很多这样的计算,或者使用 Cython,或者编写 Python C/C++ 扩展等,但现在你的问题看起来像XY problem
  • 请说明a ** b-1 是指a**(b-1) 还是(a**b)-1

标签: python performance exponentiation modular-arithmetic


【解决方案1】:

请注意,a**b//c%d == a**b%(c*d)//c%d 适用于任何正整数。这是真的,因为存在一个正整数k 使得a**b == k*c*d + a**b%(c*d) 成立并且右侧的操作//c%d 的结果不受任何k 的影响。 根据这个事实,a**b//c%d可以用一个命令计算出来

pow(a,b,c*d)//c%d

【讨论】:

  • 非常好。我实际上已经猜到了这一点,但不知何故甚至没有对其进行测试就将其驳回。傻我:-)
  • 我认为你错过了等式中的 -1,因为它没有减法但没有减法,因为 -1 不是指数的一部分,但它是在取幂后完成的,但这很接近。
猜你喜欢
  • 2014-08-23
  • 2010-09-18
  • 1970-01-01
  • 2015-02-10
  • 2015-01-05
  • 2011-11-29
  • 2021-02-05
  • 1970-01-01
  • 2013-09-05
相关资源
最近更新 更多