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 作为输出。然后我尝试个人现在我得到 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
解决方案
您正在应用对它们不是的上下文(浮点数)中的整数有效的身份。
让它变得非常简单: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
-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
b
c
推荐阅读
- go - Redigo:如何使用 Golang 从 Redis 获取键值映射?
- swift - 使用 SwiftUI 中活动 TextField 中的值更新非活动 TextField
- c++ - C++ 中的 PowerShell
- python - 我可以将多处理与客户 Tweepy StreamListner 类一起使用吗?
- spring - Spring Data JPA:如何对 RDS Aurora PostgreSQL 实例之间的读取查询进行负载平衡?
- rest - 如何将用户凭据作为 JSON 传递
- node.js - Nodejs中重复的child_process
- visual-studio - Macbook Pro 2015 (Windows 10 by parallel) 上的 Visual Studio 2015 安装问题
- java - 为什么 .getClass 强迫我使用扩展?
- lua - 如何在 Windows 上为 lua 5.1.5 制作 makefile 或为 lua 5.3.5 获取 LuaSocket?