原根primitive root

n>1,(a,n)=1,使同余式a^{d}\equiv 1 \bmod n成立的最小正整数d称为a对模n的指数,阶(order),基。记为ord_{n}\left ( a \right )

ord_{n}\left ( a \right )=\phi(n),则称a为模N的原根。

以下程序只能判断N为质数时模N的原根。

对于模4的primitive_root=3,模9的primitive_root=2,5这些情况无法判断。 

def find_primitive_root(n):
    
    for base in range(1,n):
        l=[]
        for index in range(1,n):
            l.append(pow(base,index,n))
        if len(set(l))==n-1:
            print('primitive root {} of {}'.format(base,n))

find_primitive_root(11)
# primitive root 2 of 11
# primitive root 6 of 11
# primitive root 7 of 11
# primitive root 8 of 11

mod 9的情况

   1, 2, 3, 4, 5, 6, 7, 8
1 [1, 1, 1, 1, 1, 1, 1, 1]
2 [2, 4, 8, 7, 5, 1, 2, 4]
3 [3, 0, 0, 0, 0, 0, 0, 0]
4 [4, 7, 1, 4, 7, 1, 4, 7]
5 [5, 7, 8, 4, 2, 1, 5, 7]
6 [6, 0, 0, 0, 0, 0, 0, 0]
7 [7, 4, 1, 7, 4, 1, 7, 4]
8 [8, 1, 8, 1, 8, 1, 8, 1]

phi(9)=3*2=6

2,4,5,7,8都符合,但是只有2,5模9的阶为6。

4模9的阶=3,7模9的阶=3,8模9的阶=2,不符合定义。

所以只有2,5为模9的原根。

判断[2,phi(n)-1]范围内是否有1即可

勉强能用,euler_phi抄的知乎大佬的。

import math
def euler_phi(n):
    phi = [0] * (n + 1)
    phi[1] = 1
    for i in range(2, n + 1):
        if phi[i] == 0:
            phi[i] = i - 1
            for j in range(2 * i, n + 1, i):
                if phi[j] != 0:
                    phi[j] = phi[j] // i * (i - 1)
                else:
                    phi[j] = j // i * (i - 1)
    return phi[n]

def find_primitive_root(n):
    
    for base in range(1,n):
        l=[]
        for index in range(1,n):
            l.append(pow(base,index,n))
        if len(set(l))==n-1:
            print('primitive root {} of {}'.format(base,n))


def find_primitive_root_with_euler(n):
    
    for base in range(1,n):
        l=[]
        for index in range(1,n):
            if math.gcd(base,n)!=1:
                continue
            l.append(pow(base,index,n))
        if len(set(l))==euler_phi(n):
            print('primitive root {} of {}'.format(base,n))


for each in range(1,14):
    print(each)
    find_primitive_root_with_euler(each)
    print()

参考资料:A046147 - OEIS

 table--20以内的数的原根

2
primitive root 1 of 2

3
primitive root 2 of 3

4
primitive root 3 of 4

5
primitive root 2 of 5
primitive root 3 of 5

6
primitive root 5 of 6

7
primitive root 3 of 7
primitive root 5 of 7

8

9
primitive root 2 of 9
primitive root 5 of 9

10
primitive root 3 of 10
primitive root 7 of 10

11
primitive root 2 of 11
primitive root 6 of 11
primitive root 7 of 11
primitive root 8 of 11

12

13
primitive root 2 of 13
primitive root 6 of 13
primitive root 7 of 13
primitive root 11 of 13

14
primitive root 3 of 14
primitive root 5 of 14

15

16

17
primitive root 3 of 17
primitive root 5 of 17
primitive root 6 of 17
primitive root 7 of 17
primitive root 10 of 17
primitive root 11 of 17
primitive root 12 of 17
primitive root 14 of 17

18
primitive root 5 of 18
primitive root 11 of 18

19
primitive root 2 of 19
primitive root 3 of 19
primitive root 10 of 19
primitive root 13 of 19
primitive root 14 of 19
primitive root 15 of 19

20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值