【发布时间】:2021-03-28 05:54:05
【问题描述】:
所以我一直在尝试实现高效的模幂运算。这是我尝试过的
def mypow(x, y, z):
return x**(y % log(z, x))
但是,结果有点奇怪, 我的测试用例:
z = 100
x = 2
for y in range(100):
print(mypow(x, y, z), pow(x, y, mod=z))
结果:
1.0 1
2.0 2
4.0 4
8.0 8
16.0 16
32.0 32
64.0 64
1.2799999999999996 28
2.559999999999999 56
5.119999999999998 12
10.239999999999997 24
20.479999999999993 48
40.95999999999999 96
81.91999999999997 92
1.6383999999999987 84
这个程序显然有缺陷,但正确的解决方案似乎就在几个数字之后。例如,虽然 1.2799999999999996 != 28, 27.9999... ~= 28。抱歉我的英语不好。
我尝试了几个不同的 x、y 和 z,这似乎是一个相当一致的模式。虽然对该程序有缺陷感到失望。这种模式很有趣,我想知道这可能是什么原因。
【问题讨论】:
-
你从哪里得到模幂运算这样的想法?
return x**(y % log(z, x))没有数学意义。 -
好吧,也许吧。但是有什么解释为什么我们会在测试用例中看到这种模式?
-
既然这是一个相当一致的模式,我拒绝相信这仅仅是巧合。
-
“为什么我们会看到这种模式......?”你的意思是什么模式?这似乎是无效代数和自然浮点表示的直接结果?
-
您看到的模式确实有解释,但解释它是一个数学问题,而不是编程问题。如果你想解释这个模式,你应该把它改成一个数学问题,然后在 math.stackexchange.com 上提问。
标签: python math floating-point modulo logarithm