子集积的复杂度

发布于 2024-10-09 23:49:17 字数 770 浏览 5 评论 0 原文

我有一组使用以下公式生成的数字,其中整数 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 完全的(基于与子集和问题的相似性)。

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

例如。 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

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

I have a set of numbers produced using the following formula with integers 0 < x < a.

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

For example starting at 2 with a = 649.

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

I am after a subset of these numbers that when multiplied together equals 1 mod N.

I believe this problem by itself to be NP-complete (based on similaries to Subset-Sum problem).

However starting with any integer (x) gives the same solution pattern.

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

I am wondering if this additional fact makes this problem solvable faster?
Or if anyone has run into this problem previously or has any advice?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苏别ゝ 2024-10-16 23:49:17

所以f(x) = g^(2^x) % a,其中g=f(0)。您可以使用欧拉定理找到一些 f(x) 相乘即可得到 1。欧拉定理指出g^Phi(a) % a = 1 (Phi(a) = 欧拉 totient 函数 = 与 a 互质的整数 数量代码>)。因此,您只需计算 Phi(a),然后将其分解为其位表示形式,并选择适当的 x 来设置加在一起形成 Phi 的位(a)

也许举个例子会更清楚。令a = 54,然后Phi(a) = 18。那么18 = 2^4 + 2^1,所以f(4) * f(1) = g^(2^4+2^1) = g^18 = 1< /代码> mod <代码>a

所有这些都很简单,但您确实需要计算 Phi(a)。一般来说,这很困难(相当于对 a 进行因式分解),但如果您知道 a 是素数,那么它就会很容易。

请注意,该解决方案不依赖于 g = f(0) 的值,除了 ga 互质的事实(如果不是,则没有任何解决方案)。

在您的例子中,Phi(649) = 580 = 2^9 + 2^6 + 2^2,因此您将 f(2)、f(6) 和 f(9) 相乘。

So f(x) = g^(2^x) % a, where g=f(0). You can use Euler's theorem to find some f(x) to multiply together to get 1. Euler's theorem states that g^Phi(a) % a = 1 (Phi(a) = Euler's totient function = # of integers < a which are relatively prime to a). So you just need to compute Phi(a), then decompose it into its bit representation and pick the appropriate x to set the bits that add together to make Phi(a).

Perhaps an example would be clearer. Let a = 54, then Phi(a) = 18. Then 18 = 2^4 + 2^1, so f(4) * f(1) = g^(2^4+2^1) = g^18 = 1 mod a.

All that is straightforward, but you do need to compute Phi(a). This is hard in general (equivalent to factoring a), but it can be easy if, for example, you know that a is prime.

Note that this solution does not depend on the value of g = f(0), other than the fact that g and a are relatively prime (if they aren't, then there aren't any solutions).

In your case, Phi(649) = 580 = 2^9 + 2^6 + 2^2, so you multiply together f(2), f(6), and f(9).

不甘平庸 2024-10-16 23:49:17

子集乘积问题也被证明是 NP 完全问题,并且与此有更强的相似性:
http://www.wolframalpha.com/entities/known_math_problems/subset_product_problem/ oa/xp/7d/

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

The subset product problem is proven NP complete as well, and has an even stronger resemblance to this:
http://www.wolframalpha.com/entities/famous_math_problems/subset_product_problem/oa/xp/7d/

Subset sum is actually solvable in pseudo polynomial time, O(nC) where C = The total "weight" (eg 649). I don't know if a similar thing is possible with subset product.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文