子群决策问题(Subgroup Decision Problem)

在看全匿名区块链文章的时候看到了同态加密算法BGN06时,我这个密码学外行就开始头痛了,遂根据参考文献找到了原文,其中就提到了BGN06加密算法基于的数学困难问题为:子群决策问题(Subgroup Decision Problem)


定义

Let x ∈ G x\in G xG be an element of a group G of order n =pq. G p G_p Gp and G q G_q Gq are prime order sub-groups of order p and q .How can we prove that x q ∈ G p x^q \in G_p xqGp?

Translation

令x∈G是阶数n = pq的G组的元素。 Gp和Gq分别是阶数p和q的素数阶子组。 我们如何证明 x q ∈ G p x^q∈G_p xqGp

换句话说:给定一个 n = q 1 q 2 n=q_1q_2 n=q1q2阶群的元素x,我们无法判定其是否属于以 q 1 q_1 q1为阶的子群。( q 1 , q 2 q_1,q_2 q1,q2均为素数)

在C++中,获取合数阶循环群的子群通常涉及到群论的概念,特别是对于有限群的操作,因为循环群(如Z/nZ,其中n是合数)有明确的结构。这里我们假设你知道循环群的基本性质,比如它们由模n整数组成,并由加法运算构成。 为了找到一个合数阶循环群的子群,你可以采取以下步骤: 1. **定义群的数据结构**:首先,你需要定义一个数据结构来表示群元素和群操作。这可以是一个模板类,包含成员变量存储元素值和一个成员函数表示加法。 ```cpp template <typename T, std::size_t N> class CyclicGroup { private: T value; public: // 加法运算 CyclicGroup operator+(const CyclicGroup& other) const { return CyclicGroup(value + other.value, N); } // 其他必要的群操作... }; ``` 2. **子群生成**:子群是由一些群元素通过加法生成的集合。对于合数阶循环群,可以选择几个互质的元素形成子群。例如,如果你的群是Z/nZ,你可以选择若干个与n互质的数a、b等,生成子群`<a>`、`<b>`等。 3. **验证子群**:检查一个集合是否构成子群,需要满足两个条件:封闭性和自反律。即任意两个元素的和也是子群的一部分,以及每个元素加自身等于自身(这是群的特性)。你可以编写一个函数来测试这些条件。 ```cpp bool isSubgroup(const std::set<CyclicGroup>& subgroup) { // 检查封闭性... // 检查自反律... } ``` 4. **遍历子群**:由于所有非平凡的循环群都是同构于Z/nZ,因此所有的子群都可以通过取不同部分来获得。可以创建一个函数来生成所有可能的子群。 ```cpp std::vector<std::set<CyclicGroup>> generateSubgroups(CyclicGroup<T, N> baseElements) { // ... 实现生成所有子群的过程... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值