22 Jul

初试在Python中使用PARI/GP

BoJone很喜欢Python,也很喜欢数论,所以就喜欢利用Python玩数论了。平时也喜欢自己动手写一些数论函数,毕竟Python支持大整数高精度运算,这点是非常好的;但是,在很多实际应用中,还是希望能有一个现成的数论函数库来调用。之前尝试过数学研发网的HugeCalc库,但是由于各种不熟悉不了了之。后来论坛上的无心老兄推荐了PARI/GP,小试一下,居然在Python上成功调用了。以后再也不用担心Python上的数论计算问题了,呵呵~

点击阅读全文...

27 Jun

Project Euler 454 :五天攻下“擂台”

进入期末了,很多同学都开始复习了,这学期我选的几门课到现在还不是很熟悉,本想也在趁着这段时间好好看看。偏生五天前我在浏览数学研发论坛的编程擂台时看到了这样的一道题目

设对于给定的$L$,方程
$$\frac{1}{x}+\frac{1}{y}=\frac{1}{n}$$
满足$0 < x < y \leq L$的正整数解共有$f(L)$种情况。比如$f(6)=1,f(12)=3,f(1000)=1069$,求$f(10^{12})$。

这道题目的来源是Project Euler的第454题:Diophantine reciprocals III(丢潘图倒数方程),题目简短易懂,但又不失深度,正符合我对理想题目的定义。而且最近在学习Python学习得不亦乐乎,看到这道题目就跃跃欲试。于是乎,我的五天时间就没有了,而且过程中几乎耗尽了我现在懂的所有编程技巧。由于不断地测试运行,我的电脑发热量比平时大了几倍,真是辛苦了我的电脑。最后的代码,自我感觉已经是我目前写的最精彩的代码了。在此与大家共享和共勉~

上述表达式是分式,不利于编程,由于$n=\frac{xy}{x+y}$,于是上述题目也等价于求$(x+y)|xy$(意思是$x+y$整除$xy$)的整数解。

点击阅读全文...

11 Jun

用PyPy提高Python脚本执行效率

《两百万前素数之和与前两百万素数之和》中,我们用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

点击阅读全文...

10 Jun

两百万前素数之和与前两百万素数之和

标题说了两道比较好玩的编程题,如果读者觉得标题绕的让人眩晕的话,那么让我再说得清晰一点:

两百万前素数之和指的是所有不超过两百万的素数的和;
前两百万素数之和指的是前两百万个素数的和。

我是从子谋的blog中看到这道题目的,前一道题目是Project Euler的第10题,后一道则是我跟子谋探索着玩的。关于子谋的研究和代码,大家可以去他的blog上学习。本文分享一下我自己的想法。

点击阅读全文...

6 Oct

哥德巴赫猜想浅谈1

高斯说过“数学是科学的皇后,而算术则是数学的女王。”这里的“算术”,其实就是我们现在所说的数论。从很小的时候开始,我便对数论情有独钟。虽然后来接触了很多更为有趣的数学分支,但是对数学的热情依然不减。我想,这大概是因为小时候的情结吧。小学时候,小小年纪的我,刚刚学完素数、合数、约数、整除等等概念,对数字尤其有兴趣。我想,在那时候我唯一能够读懂的数学难题只有数论这一领域吧。比如费马大定理,$x^n+y^n=z^n$,对于n大于2没有正整数解,很容易就知道它在讲什么;再比如,哥德巴赫猜想,每个大于4的偶数都可以分拆成两个奇素数之和,也很简单就弄懂它讲的是什么。所以,小小的我看懂了这些问题后就饶有兴致地摆弄数字啦,也许正因为如此,才让我对数字乃至对数学都有深厚的爱。

哥德巴赫猜想,无疑是数论中的一个璀璨明珠,可是目前来讲,它还是可望不可即的。一个看似如此简单的猜想,却困惑了数学家几百年,至今无人能解。尽管如此,我还是愿意细细地研究它,慢慢地品味它,在“论证”、或者说验算它的时候,欣赏到数学那神秘的美妙。本文主要就是研究给定偶数的“哥德巴赫分拆数”,即通过实际验算得出每个偶数分拆为两个素数之和的不同分拆方式的数目,比如6=3+3,只有一种分拆方式;8=3+5=5+3;有两种分拆方式;10=3+7=5+5=7+3,有三种分拆方式;等等。偶数2n的分拆数记为$G_2 (2n)$。

(这里定义的“分拆数”跟网上以及一般文献中的定义不同,这里把3+5和5+3看成是两种分拆方式,而网上一般的定义是只看成一种。我这里的定义的好处在于分拆方式的数目实际表示了分拆中涉及到的所有素数的个数。)

哥德巴赫猜想很难,这话没错,但是事实上哥德巴赫猜想是一个非常弱的命题。它说“每个大于4的偶数至少可以分拆成两个奇素数之和”,用上面的术语来说,就是每个偶数的“哥德巴赫分拆数”大于或等于1。可是经过实际验算发现,偶数越大,它的哥德巴赫分拆数越大,两者整体上是呈正相关关系的,比如$G_2 (100)=12,G_2 (1000)=56,G_2 (10000)=254$......所以,从强弱程度上来讲,这和“少于n的素数至少有一个”是差不多的(当然,难度有天壤之别)。

点击阅读全文...