微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python模差异答案?

如何解决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 作为输出。然后我现在尝试个人,我得到了与第一个不同的答案。

我如何解决这个错误,因为我知道 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

解决方法

您正在应用对整数无效的上下文(浮点数)中的有效标识。

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

您的代码中存在相同的基本问题,但这里用您可以在头脑中计算出来的数字进行说明:

Case

请注意,如果 COUNT(DISTINCT CASE WHEN `Case` NOT IN (1,2) THEN ID END) >>> a = 1000.0 >>> b = 0.5 >>> c = a >>> ((a % c) * (b % c)) % c 0.0 >>> (a * b) % c 500.0 a 都是整数,表达式确实会给出相同的值 - 但 b 会破坏它。

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

一点见解

在对 c 取模时,我们使用的是 b = 0.5 的整数倍从无限精确值中删除的值。因此,例如,在数学上,

c

对于一些整数 ca % c = a - n1 * c and b % c = b - n2 * c 。如果我们添加这些,

n1

因此结果仍然是从无限精确结果 (n2) 中去除的 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 * aa 都是整数,则必须是它,但如果不是,则取决于精确值。这就是为什么您所依赖的身份始终适用于整数,但可能不适用于非整数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。