liangbch 发表于 2017-12-28 18:16:33

重大消息-一种新的任意精度对数算法研制成功

   重大消息,近日,由我自己独创的对数log(x)算法终于定型。其复杂度与当前公开发表的最好的算法AGM同,都是O(log(P)M(P)),p为精度,其中M(P)代表两个P位整数相乘所需要的基本运算的次数。但是我的算法有很小的常数因子,故速度更快。测试报告显示,这个算法的性能是非常令人振奋的,在100-10000位精度下,可比现在最快软件Mathematica快2.8到8倍。计算一个正数的对数精确到1万位,仅需2.53毫秒。

下面给出性能数据测试平台:
处理器: Intel(R) Core(TM) i7-2600K CPU @3.40GH
操作系统: Windows7 32-bit
Maple 版本:17.0
Mathematica版本: 10.3.0 32-bit
Pari版本: 2.9.3
mpfr版本:3.1.6



位数时间,单位为毫秒
MapleMathematicaPariMPFRBCMP_log1BCMP_log2
200.0299410.002390150.0031140.0048330.0086540.000762
300.0403540.002980780.0037440.0056670.0082180.000975
400.0437680.003656480.0046870.0064560.0102370.001043
500.0454050.00434370.0052670.0067820.0105150.001217
600.0613360.005193750.0070680.0089390.0120520.002432
700.0637220.006536490.0081290.0093730.0124670.002622
800.065230.007235030.0089180.0104510.0140110.002847
900.0674880.008357620.0094010.0108590.0139890.002967
1000.0698350.009155810.0114040.0121450.0171130.003194
1250.0721670.01181240.0134340.0143760.0200850.003843
1580.0795780.01768950.0202950.0185680.0260150.004825
1990.0849530.02432750.0274640.0230960.0326860.005604
2510.1010580.03258440.0394370.0300760.0413130.006338
3160.1113910.04832440.0572340.038740.0573980.008075
3980.1255920.06257760.0902150.0547130.0763840.009971
5010.1402050.08378510.1262190.0768010.1008510.012947
6300.1698630.1374650.1734710.12270.1267750.025564
7940.2012570.2020880.2624010.1927410.1755620.022624
10000.269650.3117440.3782750.297290.2604770.041692
12580.3445990.424280.5459050.4253570.3217570.056777
15840.4379880.5743930.8362170.6710660.5045610.077545
19950.5706680.8149061.2192221.0429760.6712090.133183
25110.8071291.118781.7238481.4482820.9830840.190615
31621.072661.576542.5618282.2573361.4893760.273305
39811.477542.261333.669072.9590932.1559750.510987
50112.152343.069575.2084273.7880493.1939570.727249
63092.966154.369797.7239285.7095514.5078391.019573
79434.06256.2534411.0717217.8947516.7538581.748821
100006.338548.5029415.95027910.1983019.6499342.538205
1778215.114619.886138.91621823.86208823.5694656.929607
3162242.2552.104694.35258168.98075962.30945318.861327
56234681117.861207.879794131.337302146.62832345.943156
1000002012.67261.338587.256462296.982964364.771994117.998387



性能对比折线图,以mpfr为基准,令mpfr的运行时间为1,值越小越好。



性能对比折线图2,去掉Maple的测试结果,仍以mpfr为基准,值越小越好。

liangbch 发表于 2017-12-28 18:20:30

说明:我的第一个函数使用AGM算法,在上表中标记为BCMP_log1, 第二个使用新算法,标记为BCMP_log2。

更多的信息请参阅 http://calc.ac.cn/2017/12/25/bcmp_log_cn/

落叶 发表于 2017-12-28 19:28:25

首先祝贺你30年的不懈努力终于得以实现!!!你的对数函数运行速度超过了我一千倍,充分展现了算法的魅力,让我无力追赶:L

落叶 发表于 2017-12-28 19:52:58

同样的原理算法,c语言比vb快了快一倍,假如对c语言写的对数函数或其它函数进行汇编级优化,一般情况下大概能获得多大的提升,我没有这方面的经验,一直脑中有个问号?我虽然最早接触的是汇编并知道一些原理,但一直没有这方面的操作经历。

zeroieme 发表于 2017-12-28 20:16:50

恭喜恭喜:b:
希望有ARM芯片的测试,还有并行优化:lol

liangbch 发表于 2017-12-28 20:50:01

这个对数算法是基于我自己的大数库的,其中使用了超过10万以上的汇编代码。14万行汇编代码中,手工写的为5万多行,基于\( 2^{30} \) 和基于\( 10 ^9 \)各占一半,另外9万行代码是用程序生成的。所有改为ARM汇编是不大可能了。不过,我有个计划,实现一个基于GMP的对数函数,这样就有ARM版的。
关于并行优化,倒是容易实现,因为这个算法很容易并行化,不过,多线程的实现需要使用更多的内存,我暂时不打算实现。

liangbch 发表于 2017-12-28 20:52:04

回4楼,大数库的关键是乘法,而乘法的关键是basecase乘(硬乘法),因为karatsuba,toom算法最终会调用basecase乘,故basecase乘法性能的提高可直接提高大数库的整体性能。
我写了5个版本的basecase乘,其中最后一个版本性能不稳定。我的大数库中实际使用的是mpn_B30_mul_basecase_2ways_SSE2。下面是几个函数的性能数据。可以看到,mpn_B30_mul_basecase_2ways_SSE2        的性能是的c语言版的性能的4.47=(3.902/0.872)倍。


# BIN_BASECASE_MUL = mpn_B30_mul_basecase_C        # cycle=3.902
# BIN_BASECASE_MUL = mpn_B30_mul_basecase_ALU        # cycle=2.771
# BIN_BASECASE_MUL = mpn_B30_mul_basecase_1way_SSE2        # cycle=1.446
BIN_BASECASE_MUL = mpn_B30_mul_basecase_2ways_SSE2        # cycle=0.872
# BIN_BASECASE_MUL = mpn_B30_mul_basecase_scatter_SSE2        # cycle=0.742

落叶 发表于 2017-12-28 21:12:22

感谢你的详细讲解和详细的数据!!!

wayne 发表于 2017-12-28 21:39:18

有测试代码吗?我想在我的电脑上跑跑。 对了。现在基本上都是64位的天下了,不知道64位支持否。

另外,这种对比测试对有界面的Maple和Mathematica来说,可能不一定公平。

liangbch 发表于 2017-12-28 21:48:42

现在,还没有可供使用的Dll,另外,配置也比较麻烦,现在还给不出方便的测试码
页: [1] 2 3 4 5 6 7
查看完整版本: 重大消息-一种新的任意精度对数算法研制成功