24小时热门版块排行榜    

查看: 2054  |  回复: 30
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

holmescn

金虫 (正式写手)

[交流] Euler 工程 第廿九题:有多少不同的项? 已有4人参与

第廿八题是个数学题, 除了生成矩阵的算法外, 好像没什么太多的思考.  所以再来个题吧.

取指数函数a^b, 其中a和b都取遍[2,5]间的所有整数, 所有可能的组合可以得到:

2^2=4, 2^3=8, 2^4=16, 2^5=32
3^2=9, 3^3=27, 3^4=81, 3^5=243
4^2=16, 4^3=64, 4^4=256, 4^5=1024
5^2=25, 5^3=125, 5^4=625, 5^5=3125

把结果从小到大排列, 并去掉重复的数:

4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

一共15个数

如果a和b取遍[2,100]间所有的整数, 那可以得到多少个不同的数?

[ Last edited by holmescn on 2011-6-17 at 10:00 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

好像又是个关于质数的题, 难怪"1+2=3"这么重要呢.
2楼2011-06-17 10:07:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

写一行也行啊.
CODE:
print len(set([a**b for a in xrange(2,101) for b in xrange(2,101)]))

这个算法太无聊了.

想想质因数分解法.
8楼2011-06-18 09:19:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


dubo(金币+1): 欢迎常来程序语言版讨论 2011-06-18 11:41:50
OK, 完成 Python版的质数分解法, 不过不是很快,大概要3秒左右吧
CODE:
# coding: utf-8

factorsOfA = []

for a in xrange(2, 101):
    u = 2
    n = 0
    x = a
    factors = []
    while u <= a:
        if x % u == 0:
            n += 1
            x /= u
        elif n != 0:
            factors.append([u, n])
            n = 0
        else:
            u += 1
    factorsOfA.append(factors)

result = []
for a in factorsOfA:
    for b in xrange(2, 101):
        s = "*".join(["%d**%d" % (x[0],x[1]*b) for x in a])
        if s not in result:
            result.append(s)
print len(result)

话说LS的代码是什么东东啊.
10楼2011-06-18 10:23:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★
微尘、梦想(金币+2): 鼓励交流! 2011-06-19 17:19:09
引用回帖:
Originally posted by huycwork at 2011-06-18 15:54:04:
你这个效率太低了,乘除次数太多,而且,性能似乎受大数算法拖累。我建议你用Perl评估下大数算法的性能,就我这边看,1000万次的迭代,use bigint和no use bigint差别有几秒之多。

另外,建议你看看这个算法 ...

这个大数算法有什么关系呢?'

当然,我可以先筛出小于100的质数. 然后再把2到100这些数做分解. 不过,我觉得这个算法的瓶颈不在这里. 那个分解过程用不了1秒. 主要是下面怎么做指数乘法, 并用什么方法做比较. 这个地方我用了太多的转换, 所以慢了.

[ Last edited by holmescn on 2011-6-18 at 18:07 ]
12楼2011-06-18 17:49:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

刚测了一下, 整个算法平均用时1.5秒, 分解只用了千分之1.5秒. 所以, 不是主要矛盾,不用优化.
14楼2011-06-18 18:15:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

引用回帖:
Originally posted by huycwork at 2011-06-18 18:14:07:
电路板实现的乘除算的是定点数,计算时间接近常数,但目前实现大数算法时多半都用用循环实现的,像加法的大数算法,二进制的补码实现看起来像这样:
[code]
int add(int bs1, int bs2){
        int t, ac = bs ...

python那个大数算法版很快的啊, 比我后来这个算法快很多的. 应该是使用了gmp和mpfr这样的库的原因.

大数乘法有算法的, 不用做竖式那样的乘. arXiv上应该有文献.
15楼2011-06-18 18:19:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

引用回帖:
Originally posted by huycwork at 2011-06-18 18:36:01:
仿竖式的话其实就是多项式算法嘛,即使优化过也在n~n*n之间,不管怎么看也很浪费了,相比于GPU而言。
如果这么确定,后面除了join之外也没看出来什么耗时的操作了,还有一个麻烦可能是数组的合并操作,append ...

这里转换成字符串和用字符串做比较可能是有点低效, 特别是那个 not in, 可能是问题的关键, 不过没有做profile, 这个算法在不做大数运算的情况下,还算一般吧。 改成C的可能就快了。一些分配内存的动作也耗时
17楼2011-06-18 22:09:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 holmescn 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见