首页 > 解决方案 > Python模差异答案?

问题描述

在解决数学问题时,我遇到了这个问题。相同类型的操作geeting diff ans
mod=1e9+21


  mod=1000000000+21
  for i in range(20,21):
  f3=pow(math.sqrt(7),i+2)*math.cos(i*math.atan(math.sqrt(3)/2))  #combine

  x1=pow(math.sqrt(7),i+2)%mod #diff
  x2=math.cos(i*math.atan(math.sqrt(3)/2))%mod

  print((x1*x2)%mod)
  print(f3%mod)
  
output

866216427.0

729324812.000003

我尝试计算组合模然后我得到 866216427.0 作为输出。然后我尝试个人现在我得到 diff ans 而不是第一个。

我如何解决这个错误,因为我知道 f3 ans 是正确的

F1=f1*f2*f3
print(F1%mod)

or you do either in this format
 F1=(((f1%mod)*(f2%mod))%mod*(f3%mod))%mod
 you get same ans as per modulo property . 

i am using same propery then why i am geeting diff ans

标签: pythondoublemodulo

解决方案


您正在应用对它们不是的上下文(浮点数)中的整数有效的身份。

让它变得非常简单:4 与 8 模 4 一致(两者都与 0 一致),但4 * (1/4) = 1 与 8 * (1/4) = 2 模 4 不一致。您可以将两边都乘以一个整数并保持同余,但如果您乘以一个非整数实数,则不一定如此。

您的代码中存在相同的基本问题,但这里用数字说明了您可以在脑海中解决的问题:

>>> a = 1000.0
>>> b = 0.5
>>> c = a
>>> ((a % c) * (b % c)) % c
0.0
>>> (a * b) % c
500.0

请注意,如果 、 和 都是整数,则表达式确实给出了相同的值a-bcb = 0.5破坏它。

哪个是对的”?对此没有答案:它们是计算不同结果的不同表达式。

一点见解

在进行模运算时c,我们正在处理c从无限精确值中移除的整数倍的值。所以,例如,在数学上,

a % c = a - n1 * c
and
b % c = b - n2 * c

对于一些整数n1n2。如果我们添加这些,

a % c + b % c = a + b - (n1 + n2) * c

所以结果仍然是从无限精确结果 ( n1 + n2) 中c移除的整数倍 ( a + b)。

但如果我们将它们相乘,

(a % c) * (b % c) =
(a - n1 * c) * (b - n2 * c) =
a*b + (n1 * n2 * c - n1 * b - n2 * a) * c

当且仅当是整数时,它是c从无限精确结果 ( )中删除的整数倍。如果,和都是整数,则它必须是,但如果不是,则取决于精确值。这就是为什么您所依赖的身份始终适用于整数但可能不适用于非整数。a*bn1 * n2 * c - n1 * b - n2 * aabc


推荐阅读