如何解决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 作为输出。然后我现在尝试个人,我得到了与第一个不同的答案。
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
对于一些整数 c
和 a % 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*b
、n1 * n2 * c - n1 * b - n2 * a
和 a
都是整数,则必须是它,但如果不是,则取决于精确值。这就是为什么您所依赖的身份始终适用于整数,但可能不适用于非整数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。