【问题标题】:Finding an element in a cyclic group of prime order在素数循环群中查找元素
【发布时间】:2011-01-31 21:00:31
【问题描述】:

在给定生成器的情况下,如何检查元素 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

【问题讨论】:

  • 您使用哪种语言并向我们展示您尝试过的内容
  • 通常情况下,我不会只写出代码,但您的编程似乎还不错。我想,是问题的数学问题让你坚持了下来。
  • 等等,什么?你的群是q阶的乘法群,对吧?所以 any 整数不能被 q 整除是群的一个元素。 [或者,如果你为每个残基类选择一个代表,就像你的代码那样,那么组就是 {1, ... , q-1}。] 不管怎样,你不必写那么多代码。 :-)
  • 我假设提问者实际上是指 G 是由 g 生成的 (Z/q)* 的子群。
  • 我已经删除了我的答案,因为我认为我对您所考虑的组类型有误。很抱歉造成混乱。

标签: java algorithm math cyclic


【解决方案1】:

也许你有更多关于组长什么样的信息。

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

1 = xord(G) mod q.

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

【讨论】:

    【解决方案2】:

    查看discrete logarithm 问题和algorithms 来解决它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      相关资源
      最近更新 更多