-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathphi.py
60 lines (54 loc) · 1.32 KB
/
phi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import math
maxn=1000000
maxn1=100000
phi=[0]*(maxn+1)
prime=[0]*(maxn1)
mark=[False]*(maxn+1)
def comp_phi():#o(maxn*loglogn)
phi[1]=1
sz=0
for i in range(2,maxn+1):
if mark[i]==False:
phi[i]=i-1
prime[sz]=i
sz+=1
#print(sz)
for j in range(0,sz):
if prime[j]*i>maxn:
break
mark[prime[j]*i]=1
if i%prime[j]==0:
l=0
x=i
while x%prime[j]==0:
x=math.floor(x/prime[j])
l+=1
m=1
for k in range(0,l):
m*=prime[j]
phi[i*prime[j]]=phi[x]*m*(prime[j]-1)
break;
else:
phi[i*prime[j]]=phi[i]*(prime[j]-1)
def primes(n):
divisors = [ d for d in range(2,n//2+1) if n % d == 0 ]
return [ d for d in divisors if all( d % od != 0 for od in divisors if od != d ) ]
def another(k):
pr=primes(k)
if pr.__len__()==0:
return k-1
else:
ph=k
for x in pr:
ph=(ph/x)*(x-1)
return ph
def main():
comp_phi()
t=int(input())
for i in range(0,t):
k=int(input())
if k<=maxn:
print(phi[k])
else:
print(int(another(k)))
main()