在主要订单的循环组中查找元素

时间:2010-03-25 18:20:11

标签: java algorithm math cyclic

在给定生成器的情况下,如何检查元素a是否属于主要订单的特定循环组G?现在我只是生成组中的所有元素,将它们保存到容器中并检查元素是否在其中。这是我目前用于生成组中所有元素的代码:

public HashSet<BigInteger> group_elements(BigInteger g, BigInteger q) {

    HashSet<BigInteger> group = new HashSet<BigInteger>();

    BigInteger element = modPow(g,ONE,q);

    for (int i = 2; !group.contains(element); i++) {
        group.add(element);
        element = modPow(g, BigInteger.valueOf(i), q);
    }

    return group;

}

要查看元素是否在组中,我只需检查:

if (group.contains(num)) { ... }

正如您所看到的,语言是Java

2 个答案:

答案 0 :(得分:3)

也许您有关于该群体的更多信息。

如果你知道由g生成的组G的顺序,并且如果q是素数(你只告诉我们G的阶数是素数,但没有关于q)那么你可以检查元素x是否在G中通过测试

  

1 = x ord(G) mod q。

如果q不是素数,那么此测试不起作用。一个反例,将是g = 22,q = 91,x = 53.这里g生成具有元素{1,22,29}的子组。 x也有3阶,但不是g生成的子组的元素。

答案 1 :(得分:1)

查看discrete logarithm问题,然后algorithms解决问题。