' exec'之间的区别和'选择&#39 ;;素数因子分解算法

时间:2014-08-20 15:48:31

标签: algorithm kdb

首先,我无法理解execselectkdb之间的区别。 reference for exec并没有多大帮助!

其次,我试图编写一个程序来解决Euler problem 5。我使用modeach解决了这个问题,但速度慢,需要大量空间。我相信我可以通过将20的素数分解的值相加来实现。那是对的吗?如果是这样,有人可以协助我这样做吗?我已经写了以下内容来获得素数因子分解。它还无法列入清单。

f1:{(x mod y) = 0}
f2:{if[f1[a;y]&(not max f1[y;x],0);x:x,y];x}
f3:{x+:1;y:f2[y;x];if[x<a;y:.z.s[x;y]];y}
f3[1;()

3 个答案:

答案 0 :(得分:4)

关于第一个问题,exec基本上是select的更一般形式。 select查询将以表格格式返回您查询的内容,而exec更灵活,可以从表中返回您想要的任何类型的数据。 例如,如果我们有一个表

t:([]a:10?`aa`bb`cc;b:10?10)

然后我们可以使用exec从表中获取列数据列表

q)exec a from t
`cc`aa`aa`aa`bb`aa`bb`cc`cc`cc

有时非常方便。还

q)exec a,b from t
a| cc aa aa aa bb aa bb cc cc cc
b| 6  4  1  3  3  7  8  2  1  4
q)exec a!b from t
cc| 6
aa| 4
aa| 1
aa| 3
bb| 3
aa| 7
bb| 8
cc| 2
cc| 1
cc| 4

提取字典。第一个将列名称作为键,将列作为值,第二个将列a作为键,将列b作为值。在创建数据透视表http://code.kx.com/q/cookbook/pivoting-tables/时可以看到这些正在使用的一个很好的小例子。

最后,您可以使用

获取完整的表格
exec by 0b from t

相当于

select from t

by 0b隐含在select语句中。事实上,你可以通过查看两者的解析树来看到这一点。

q)parse"exec from t"
?
`t
()
()
()
q)parse"select from t"
?
`t
()
0b
()

答案 1 :(得分:1)

这个问题的简单解决方案是: -

LCM(1,2,3,......20)=1*5*7*8*9*11*13*17*19=116396280;

因此,为LCM程序开发代码,该程序将给出n个数字的LCM ......

答案 2 :(得分:1)

关于你的第二个问题,你也可以使用欧几里得的算法来快速解决问题。

欧几里德的算法。用于查找2个数字的GCD,速度非常快。它使用以下属性:

GCD(a; b)= GCD(b; a mod b)。这一直持续到(a mod b)返回0并且一旦发生这种情况,'b'就是gcd。

参考(GCD部分):http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=math_for_topcoders

可以使用GCD找到LCM。

  LCM of a&b = (a*b) / GCD of a & b

此外,还需要另外一个公式:

  LCM of a & b & c = LCM of (LCM of a & b) & c

使用上面的算法和逻辑,这是我尝试过的:

    q) gcd:{[a;b] first {(x[1];x[0] mod x[1])}/[{0<>x[1]};(a;b)]}

    q )lcm:{[l]{floor (x*y) % gcd[x;y]}/[l]}

    q) lcm[1_til 10]

输出:2520

    q) lcm[1_til 20]

输出:232792560

    q) \ts lcm[1_til 20]

输出:0 864

计算时间不到1毫秒(约15毫秒)。