我所知道的最有效的方法是使用 godel 数。 Google for godel 编码。
想法是这样的。假设您有 N 个可能的数字,并且需要将它们组合起来。例如,N=100,000 并且想要制作 {1,2,3}、{5,88,19000} 等集合。
我们的想法是将 N 个素数列表保存在内存中,对于给定的集合 {a, b, c, ...},您将其编码为
prime[a]*prime[b]*prime[c]*...
因此,您将集合编码为 BigNumber。 BigNumbers 的运算尽管比 Integers 的运算慢,但仍然非常快。
要合并2组A,B,你拿
UNITE(A, B) = lcm(a, b)
A 和 B 的最小公倍数,因为 A 和 B 是集合并且都是数字。
为了让你走的路口
INTERSECT(A, B) = gcd (a, b)
最大公约数。
等等。
这种编码叫做godelization,你可以google一下,所有用弗雷格逻辑写的算术语言都可以用数字编码。
要获取操作is-member?很简单——
ISMEMBER(x, S) = remainder(s,x)==0
要获得红衣主教有点复杂--
CARDINAL(S) = # of prime factors in s
你分解代表素数乘积中集合的数字 S 并添加它们的指数。如果集合不允许重复,您将拥有所有指数 1。