子集产品的复杂性

时间:2011-01-02 07:45:42

标签: math complexity-theory

我有一组使用以下公式生成的数字,其中整数0< x<一个。

f(x) = f(x-1)^2 % a

例如从2开始,a = 649。

{2, 4, 16, 256, 636, 169, 5, 25, 649, 576, 137, ...}

我追随这些数字的一个子集,当它们相乘时等于1 mod N。

我认为这个问题本身就是NP完全的(基于Subset-Sum问题的相似之处)。

但是从任何整数(x)开始都会给出相同的解决方案模式。

EG。 a = 649

{2,4> 16 ,256,636,169, 5 ,25,649, 576 ,137,... } = 16 * 5 * 576 = 1%649
{3,9, 81 ,71,498,86, 257 ,500,135, 53 ,213,...} = 81 * 257 * 53 = 1%649
{4,16, 256 ,636,169,5, 25 ,649,576, 137 ,597,...} = 256 * 25 * 137 = 1%649

我想知道这个额外的事实是否能让这个问题更快解决? 或者,如果有人以前遇到过这个问题或有任何建议吗?

2 个答案:

答案 0 :(得分:3)

所以f(x) = g^(2^x) % ag=f(0)。您可以使用欧拉定理找到一些f(x)乘以一起得到1. Euler's theorem个状态g^Phi(a) % a = 1Phi(a) = Euler's totient function =#of integers {{ 1}}是< a的相对素数。因此,您只需要计算a,然后将其分解为其位表示,并选择适当的Phi(a)来设置加在一起的位以生成x

也许一个例子会更清楚。设Phi(a),然后a = 54。然后是Phi(a) = 18,所以18 = 2^4 + 2^1 mod f(4) * f(1) = g^(2^4+2^1) = g^18 = 1

所有这一切都很简单,但您需要计算a。这一般很难(相当于因子Phi(a)),但是,例如,如果你知道a是素数,那就很容易了。

请注意,此解决方案不依赖于a的值,除了g = f(0)g是相对素数的事实(如果它们不是,那么就没有'任何解决方案)。

在你的情况下,a,所以你将f(2),f(6)和f(9)相乘。

答案 1 :(得分:1)

子集产品问题也证明了NP完整,并且与此更加相似: http://www.wolframalpha.com/entities/famous_math_problems/subset_product_problem/oa/xp/7d/

子集和实际上可在伪多项式时间O(nC)中求解,其中C =总“权重”(例如649)。我不知道子集产品是否有类似的东西。