2014-9-7 P.S.更新 v3.5 版。(本文原发布日期为8月3日)
这是一个判断一正整数(1 除外)是否为质数的程序。
写这个程序缘由是有关参加本省数学竞赛的,即 2014 年湖南省高中数学竞赛中一道选择题中要判断 2011 是否为质数。虽然我当时就觉得是质数,但是仍不能确定,于是就产生了写程序求证的想法。想法很好,我有时候就是缺想法。本着脚踏实地从基层干起,将基本数学方法编程的理念,我写了这个程序。前后共有 3 个版本。原来一个看似简单的程序也并不简单,或许是我有点晕影响了智力发挥?
v1.0
这是最初的版本。
我考虑到要判断一个数 n 是否为质数,只需看没有还是有两个因数 a,b 相乘等于 n 就行了。我设了两个变量,并且很“聪明”地设定循环使 2≤a≤根号n,然后嵌套循环内使 2≤a≤n/a;但是我当时显然没有意识到,有一种更快更简单的方法能让我避免如此繁冗计算“趋近” n 的。
这样造成,程序运行得很费劲;更糟糕的是,n 的范围被限制得致命地小!(不能超过 65533!)
下载地址:https://github.com/shansing/pnj/archive/v1.0.zip 【是的,此项目托管在 GitHub 了(主页在这儿),似乎让 GitHub 大材小用了。】
v2.0
还好,之后我意识到了所犯错误,于是修改了算法;第二版诞生了。
显然,要找出假定的两个正整数 a,b 使得 a*b=n,只要设定循环使 2≤a≤根号n,再令 b=n/a 判断 b 是整数与否就好了。
改进之后,速度有了大幅提升。n 的支持的范围也更广了;不过它受到 VB 的限制,精确的话只支持 15 位及以内的整数——但这相比前一版,显然也是个飞跃了。这一版的 BUG 是,n 很大时,进度条会出现问题。
下载地址:https://github.com/shansing/pnj/archive/v2.0.zip
v3.0
我当时也没想到会有这第三版。
不久我发现,输出结果太繁琐,不如写成一个 n 等于其所有质因数之积的等式。于是,“质数判断”实际上变成了“因数分解”。
在核心算法没变的基础上,此程序的处理速度居然也大幅提升了,这又给了我一个启示。
下载地址:https://github.com/shansing/pnj/archive/v3.0.zip
v3.5
再不久,我又发现,将窗口最小化时程序处理得要快很多。经探究,此乃进度条绘制的问题。于是重写之,速度当即大幅提升。顺便还调整了一下界面布局。
因为没有改动核心算法,故不增加主版本号。
下载地址:https://github.com/shansing/pnj/archive/v3.5.zip
关于因数分解
这个程序的算法显然最多只算得上是中学水平。对于大整数的因数分解,还有更加高级好用的算法呢。详见维基百科整数分解词条。
关于我与 VB6
又显然,VB6 在当今时代显得有些“日薄西山”了。因而我也正在寻找其替代品。
我找到了快手(AAuto)。它像 VB 一样轻巧,有着与 VB 相似的代码风格,但更加灵活:我相信它绝对不会只是个替代品。其作者系国人,AAuto 是免费开源的,使用它也符合我的理想宗旨。于是我准备要学习 AAuto 了。
我的 VB 程序中还有一个大作(误)叫“教室小管家”,找个时间将它发布了吧。VB 生涯该结束了。
插话一句:图片的位置问题留待稍候解决,造成的不便敬请谅解。
一看就很高端嘛~
不要取笑。
没有,我数学好差的= =
话说这个程序我也写过但是算法太烂
不妨也分享一下。。
http://blog.chenyuheng.cn/305.cyh
哈哈..求破解RSA 1024bit
话说新风格高端炫酷啊
768 位的已经倒下了,1024 位的也快到岌岌可危的地步了。
感谢夸奖,要的就是这种效果哈哈。
围观博主,哇哈哈
VB大神~
给力的哈,vb!
= =AAuto只是免费,不开源的哟
你也真是蛋疼...