在给定生成器的情况下,如何检查元素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
答案 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解决问题。