hihoCoder 1606 小Hi和小Ho的密码

时间限制:10000ms

单点时限:1000ms
内存限制:256MB
描述
小Hi和小Ho一直使用加密的方式传输消息。他们使用如下方法来生成一组密码:  


首先小Hi和小Ho选择一个整数 n = pk(其中p质数、k是正整数,也即n是质数或质数的幂)。  


其次,他们会求出两个整数a和b满足0 < a < b < n,并且{{1, a, b}, *(n)}恰好构成一个合法的群,其中*(n)表示模n意义下的乘法。  


最后小Hi选择a作为密钥、小Ho选择b作为密钥。


给定一个整数n= pk,你能帮小Hi和小Ho求出各自的密钥吗?


输入
第一行一个整数T表示数据组数,接下来T行每行一个整数n,意义和描述一样。


1 ≤ T ≤ 50  


对于30%的数据,满足n ≤ 100


对于60%的数据,满足n ≤ 106


对于100%的数据,满足n ≤ 109


输出
输出T行,每行3个整数表示1, a, b代表群的3个元素。如果不存解,输出一个-1。


样例输入
1
7
样例输出

1 2 4


题目大意是给定n=p^k, p为素数.求三元组{1,a,b} 1 < a < b构成一个合法群

这种题目不看题解或代码很难做出来.

首先证明必然 a^2 =b(mod n)或(b^2) = a(mod n),如果不,则a^2 = 1(mod n) 并且b^2 = 1(mod n) 并且a*b=1(mod n),群里面就三个数,a,b必然互为逆元.两边同乘以b,可得a=b(mod n),矛盾,所以:a^2 =b(mod n)或(b^2) = a(mod n)

设a^2=b(mod n),由费马小定理可得x^phi(n) = 1(mod n),x为与n互素的整数

如果phi(n) % 3 == 0,则必然存在a=x ^ (phi(n)/3),满足条件.

如果phi(n) % 3 != 0,设phi(n) = 3 * k + y (y=1,2),如果存在a^3 = 1(mod n),则a^phi(n) = a^y = 1(mod n),则a的一次方或二次方里必然有一个mod n = 1,造成找不到所需三元组的情况.

至于phi(n) % 3 == 0, 为什么必然存在a满足条件, 可以用域里面本原元必然存在来证明,找到本原元的phi/3次方必然可以作为a,至于本原元为什么必然存在,在看ntt算法的时候查过一次证明,说什么群论里的基础,不过没有看懂

你可能感兴趣的:(随笔)