python - 如何更快地计算 (x**2-2)%n - Python
问题描述
x = 2**1000000
n = 2**100000000
(x**2-2)%n
太慢了。我找到了 pow() 但我不能使用它,因为我不能减去 2。(pow(x, 2)-2)%n
而且(x*x-2)%n
速度也很慢。当我测试(x*x-2)
它时它很快,但是当我添加模运算符时它很慢。有没有办法计算(x**2-2)%n
得更快?
解决方案
你在解释器中运行它吗?我做了一些测试,主要的减速似乎来自试图显示结果的解释器。
如果将表达式分配给变量,解释器将不会尝试显示结果,并且会非常快:
x = 2**1000000
n = 2**100000000
result = (x**2-2)%n
附录:
我最初的想法也与 MikeW 的回答相同,如果您希望代码的每一部分都快速,您可以利用 Python 的内部整数基 2 表示并使用按位左移:
x = 1 << 1000000
n = 1 << 100000000
随之而来的警告是,这仅有效,因为x
和n
是 2 的幂,并且您必须更加小心,以避免犯一个错误的错误。这个答案很好地解释了移位的基本工作原理,但是 Python 与 C、C++ 或 Java 等其他语言有点不同,因为 Python 整数是无限精度的,所以你永远不能像在其他语言中那样完全离开移位.
推荐阅读
- javascript - 为什么我的导航栏在单击切换按钮后隐藏?
- java - IntelliJ IDEA 中的“找不到要执行的声明”protos 声明
- vue.js - Vue-MultiSelect:一次使用两个多选以及如何根据其他显示的内容隐藏选项
- qemu - 操作系统开发和引导扇区在 qemu 中的位置
- c - DMA 内存到内存模式在 STM32F103C8 中不起作用
- twilio - 根据使用的 API 密钥确定计费?
- spring-boot - 以两种模式运行一个 Spring 应用程序 - 作为 CommandLineRunner 和 SpringBootServletInitializer 类型
- python - 尝试从 DnDBeyond 下载 json 文件会出现 403 错误
- loadrunner - Loadrunner 中的循环参数
- elasticsearch - ElasticSearch 词干分析器没有给出词根