用PyPy提高Python脚本执行效率
By 苏剑林 | 2014-06-11 | 23412位读者 | 引用在《两百万前素数之和与前两百万素数之和》中,我们用Python求了前两百万的素数和以及两百万前的素数和,并且得到了在Python 3.3中的执行时间如下:
两百万前的素数之和:
142913828922
time: 2.4048174478605646前两百万的素数之和:
31381137530481
time: 46.75734807838953
于是想办法提高python脚本的执行效率,我觉得在算法方面,优化空间已经比较小了,于是考虑执行器上的优化。在搜索的无意间我看到了一个名词——Psyco!这是python的一个外部模块,导入后可以加快.py脚本的执行。网上也有《用 Psyco 让 Python 运行得像 C一样快》、《利用 psyco 让 Python 程序执行更快》之类的文章,说明Psyco确实是一个可行的选择,于是就跃跃欲试了,后来了解到Psyco在2012年已经停止开发,只支持到Python 2.4版本,目前它由 PyPy所接替。于是我就下载了PyPy。
两百万前素数之和与前两百万素数之和
By 苏剑林 | 2014-06-10 | 68980位读者 | 引用初试在Python中使用PARI/GP
By 苏剑林 | 2014-07-22 | 30403位读者 | 引用从费马大定理谈起(九):n=3
By 苏剑林 | 2014-09-01 | 28719位读者 | 引用现在可以开始$n=3$的证明了。在实整数范围内n=3的证明看起来相当复杂,而且跟n=4的证明似乎没有相通之处。然而,如果我们在$\mathbb{Z}[\omega]$中考虑$x^3+y^3+z^3=0$无解的证明,就会跟n=4时有很多类似的地方,而且事实上证明比n=4时简单(要注意在实整数范围内的证明,n=4比n=3简单。费马完成了n=4的证明,但是没完成n=3的证明。)。我想,正是这样的类似之处,才让当初还没有完成证明的数学家拉梅就自信他从这条路可以完成费马大定理的证明。(不过,这自信却是失败的案例:拉梅的路不能完全走通,而沿着这条路走得更远的当属库默,但即便这样,库默也没有证明费马大定理。)
证明跟$n=4$的第二个证明是类似的。我们先往方程中添加一个单位数,然后证明无论单位数是什么,方程在$\mathbb{Z}[\omega]$中都无解。这是一个很妙的技巧,让我们证明了更多的方程无解,但是却用到了更少的步骤。事实上,存在着只证明$x^3+y^3+z^3=0$无解的证明,但需要非常仔细地分析里边的单位数情况,这是相当麻烦的。本证明是我参考了Fermats last theorem blogspot上的证明,然后结合本系列n=4的第二个证明,简化而来,主要是减少了对单位数的仔细分析。
从费马大定理谈起(五):n=4
By 苏剑林 | 2014-08-19 | 89649位读者 | 引用从费马大定理谈起(七):费马平方和定理
By 苏剑林 | 2014-08-23 | 29933位读者 | 引用本想着开始准备n=3的证明,但这需要引入Eisenstein整数的概念,而我们已经引入了高斯整数,高斯整数的美妙还没有很好地展示给读者。从n=4的两个证明可以知道,引入高斯整数的作用,是把诸如$z^n-y^n$的式子进行完全分解。然而,这一点并没有给我们展示多少高斯整数的神奇。读者或许已经知道,复分析中很多简单的结果,如果单纯用实数描述出来,便会给人巧夺天工的感觉,在涉及到高斯整数的数论中也是一样。本文就让我们来思考费马平方和定理,以此再领会在高斯整数中处理某些数论问题时的便捷。——我们从费马大定理谈起,但又并不仅仅只谈费马大定理。
费马平方和定理:奇素数$p$可以表示为两个整数的平方和,当且仅当该素数具有$4k+1$的形式,而且不考虑相加顺序的情况下,表示法是唯一的。
实数集到无理数集的双射
By 苏剑林 | 2014-09-22 | 36000位读者 | 引用集合论的结果告诉我们,全体实数的集合$\mathbb{R}$跟全体无理数的集合$\mathbb{R} \backslash \mathbb{Q}$是等势的,那么,如何构造出它们俩之间的一个双射出来呢?这是一个颇考读者想象力的问题。当然,如果把答案给出来,又似乎显得没有那么神秘。下面给出笔者构造的一个例子,读者可以从中看到这种映射是怎么构造的。
为了构造这样的双射,一个很自然的想法是,让全体有理数和部分无理数在它们自身内相互映射,剩下的无理数则恒等映射。构造这样的一个双射首先得找出一个函数,它的值只会是无理数。要找到这样的函数并不难,比如我们知道:
1、方程$x^4 + 1 = y^2$没有除$x=0,y=\pm 1$外的有理点,否则将与费马大定理$n=4$时的结果矛盾。
2、无理数的平方根依然是无理数。
根据这些信息,足以构造一个正实数$\mathbb{R}^+$到正无理数$\mathbb{R}^+ \backslash \mathbb{Q}^+$的双射,然后稍微修改一下,就可以得到$\mathbb{R}$到$\mathbb{R} \backslash \mathbb{Q}$的双射。
特殊的通项公式:二次非线性递推
By 苏剑林 | 2014-11-12 | 61997位读者 | 引用特殊的通项公式
对数学或编程感兴趣的读者,相信都已经很熟悉斐波那契数列了
0, 1, 1, 2, 3, 5, 8, 13, ...
它是由
$$a_{n+2}=a_{n+1}+a_n,\quad a_0=0,a_1=1$$
递推所得。读者或许已经见过它的通项公式
$$a_{n}=\frac{\sqrt{5}}{5} \cdot \left[\left(\frac{1 + \sqrt{5}}{2}\right)^{n} - \left(\frac{1 - \sqrt{5}}{2}\right)^{n}\right]$$
这里假设我们没有如此高的智商可以求出这个复杂的表达式出来,但是我们通过研究数列发现,这个数列越来越大时,相邻两项趋于一个常数,这个常数也就是(假设我们只发现了后面的数值,并没有前面的根式)
$$\beta=\frac{1 + \sqrt{5}}{2}=1.61803398\dots$$
最近评论