import platform
platform.platform()
platform.python_version()
import sympy as sm
sm.__version__
import numpy as np
np.__version__
import itertools as it
import random as ran
from pylab import *
%matplotlib inline
import matplotlib
matplotlib.__version__
import DSTG
np.floor(5.23)
sm.floor(5.23)
np.ceil(5.23)
sm.ceiling(5.23)
np.floor(np.pi)
sm.floor(sm.pi)
np.ceil(np.pi)
sm.ceiling(sm.pi)
np.floor(-5.23)
sm.floor(-5.23)
np.ceil(-5.23)
sm.ceiling(-5.23)
Graf cjelobrojne funkcije $f(x)=\lfloor x\rfloor$
t = np.arange(-3.0, 3.0, 0.01)
grid(True)
plot(t,np.floor(t),linewidth=3.0,color='b')
ylim([-3,3]);
grid(True)
for i in range(-3,3):
t=np.arange(i,i+1,0.01)
plot(t,np.floor(t),linewidth=3.0,color='b')
ylim([-3,3]);
Graf cjelobrojne funkcije $f(x)=\lceil x\rceil$
t = np.arange(-3.0, 3.0, 0.01)
grid(True)
plot(t,np.ceil(t),linewidth=3.0,color='r')
ylim([-3,3]);
grid(True)
for i in range(-3,3):
t=np.arange(i+0.01,i+1,0.01)
plot(t,np.ceil(t),linewidth=3.0,color='r')
ylim([-3,3]);
Cjelobrojne funkcije $\lfloor x\rfloor$ i $\lceil x\rceil$ na istoj slici
grid(True)
for i in range(-3,3):
t1=np.arange(i,i+1,0.01)
t2=np.arange(i+0.01,i+1,0.01)
plot(t1,np.floor(t1),linewidth=3.0,color='b')
plot(t2,np.ceil(t2),linewidth=3.0,color='r')
500//17
500%17
-500//17
-500%17
Neočekivani rezultati
500//-17
500%-17
Implementirane funkcije rade prema našim definicijama
DSTG.kvocijent(500,17)
DSTG.ostatak(500,17)
DSTG.kvocijent(500,-17)
DSTG.ostatak(500,-17)
DSTG.ostatak(-500,0)
np.gcd(30,18)
sm.gcd(30,18)
np.gcd(-30,18)
sm.gcd(-30,18)
np.gcd(-15,-17)
sm.gcd(-15,-17)
np.gcd(252,200)
sm.gcd(252,200)
Jedno cjelobrojno rješenje jednadžbe $252x+200y=M(252,200)$
sm.gcdex(252,200)
DSTG.euklid_rucno(252,200)
np.lcm(8,12)
sm.lcm(8,12)
np.lcm(252,200)
sm.lcm(252,200)
np.lcm(-8,12)
sm.lcm(-8,12)
np.lcm(np.lcm(12,5),14)
sm.lcm_list([12,5,14])
Ispitivanje da li je broj prost
sm.isprime(1023)
sm.isprime(17)
list(map(lambda x: sm.isprime(x), [1023,17]))
dat=open("P1.txt")
p1=int(dat.read())
dat.close()
dat=open("P2.txt")
p2=int(dat.read())
dat.close()
Broj $\ p_1$ je sigurno složeni broj.
DSTG.ispis(p1,80)
sm.isprime(p1)
sm.ntheory.primetest.mr(p1,[ran.randint(1,p1) for k in range(20)])
DSTG.ispis(p2,80)
Broj $\ p_2$ je vjerojatno prosti broj. Test se ponavlja po defaultu $20$ puta.
sm.isprime(p2)
sm.ntheory.primetest.mr(p2,[ran.randint(1,p2) for k in range(20)])
Broj $\ p_2$ je vjerojatno prosti broj s još većom vjerojatnošću. Ovaj put se test ponavlja $30$ puta.
sm.ntheory.primetest.mr(p2,[ran.randint(1,p2) for k in range(30)])
sm.ntheory.factorint(40)
sm.ntheory.factorint(4063)
sm.ntheory.factorint(10468)
sm.ntheory.factorint(10**30+1)
sm.ntheory.divisors(40)
sm.ntheory.divisors(4063)
sm.ntheory.divisors(10468)
DSTG.ispis(sm.ntheory.divisors(10**30+1),80)
sm.ntheory.primefactors(40)
sm.ntheory.primefactors(4063)
sm.ntheory.primefactors(10468)
sm.ntheory.primefactors(10**30+1)
sm.sieve._list
17 in sm.sieve
25 in sm.sieve
1047 in sm.sieve
sm.isprime(17981)
17981 in sm.sieve
proširenje sita do svih prostih brojeva manjih ili jednakih od 20000
sm.sieve.extend(20000)
sm.sieve._list
17981 in sm.sieve
DSTG.ispis([sm.ntheory.prime(n) for n in range(1,31)],80)
figure(figsize=(10,8))
grid(True)
t=[sm.ntheory.prime(n) for n in range(1,31)]
plot(range(1,31),t,'o',markersize=8,c='r')
xticks(np.arange(0,31,1))
yticks(np.arange(0,120,10))
xlim([0,31]);
figure(figsize=(10,8))
grid(True)
t=[sm.ntheory.prime(n) for n in range(1,31)]
plot(range(1,31),t,'-',linewidth=3,c='r')
xticks(np.arange(0,31,1))
yticks(np.arange(0,120,10))
xlim([0,31]);
sm.ntheory.prime(10)
DSTG.ispis(list(sm.ntheory.primerange(41,201)),80)
DSTG.ispis(list(filter(lambda x: len(sm.ntheory.primefactors(x))==1,range(41,201))),80)
sm.ntheory.nextprime(100)
sm.ntheory.nextprime(31)
sm.ntheory.nextprime(44)
sm.ntheory.nextprime(2**100)
sm.ntheory.prevprime(100)
sm.ntheory.prevprime(31)
sm.ntheory.prevprime(44)
sm.ntheory.prevprime(2**100)
DSTG.ispis(list(sm.ntheory.primerange(1,1000)),80)
sm.ntheory.randprime(1,10**2)
sm.ntheory.randprime(1,10**2)
sm.ntheory.randprime(1,10**10)
sm.ntheory.randprime(5002,23421)
p=sm.ntheory.randprime(1,10**200)
q=sm.ntheory.randprime(1,10**200)
DSTG.ispis(p,80)
DSTG.ispis(q,80)
DSTG.ispis(p*q,80)
p1=sm.ntheory.randprime(2**639,2**640)
q1=sm.ntheory.randprime(2**639,2**640)
DSTG.ispis(p1,80)
DSTG.ispis(q1,80)
DSTG.ispis(p1*q1,80)
$15x\equiv1\!\pmod{341}\qquad$ rješenje: $x=91$
DSTG.lin_kong_rucno(15,1,341,izlaz='rjecnik')
DSTG.lin_kong_rucno(15,1,341)
$10x\equiv1\!\pmod{12}\qquad$ nema rješenja
DSTG.lin_kong_rucno(10,1,12)
$79x\equiv15\!\pmod{722}\qquad$ rješenje: $x=119$
DSTG.lin_kong_rucno(79,15,722,izlaz='rjecnik')
DSTG.lin_kong_rucno(79,15,722)
$155x\equiv1185\!\pmod{1405}\qquad$ rješenja: $x=198, 479, 760, 1041, 1322$
DSTG.lin_kong_rucno(155,1185,1405,izlaz='rjecnik')
DSTG.lin_kong_rucno(155,1185,1405)
$x\equiv1\!\pmod{4},\quad x\equiv8\!\pmod{9},\quad x\equiv10\!\pmod{25}$
from sympy.ntheory.modular import crt
crt([4,9,25],[1,8,10])
$x\equiv4\!\pmod{5},\quad x\equiv1\!\pmod{12},\quad x\equiv7\!\pmod{77}$
crt([5,12,77],[4,1,7])
Funkcija koja ispisuje sve korake kod ručnog rješavanja sustava kongruencija pomoću kineskog teorema o ostacima
$x\equiv1\!\pmod{4},\quad x\equiv8\!\pmod{9},\quad x\equiv10\!\pmod{25}$
DSTG.KTO_rucno([1,8,10],[4,9,25],izlaz='rjecnik')
DSTG.KTO_rucno([1,8,10],[4,9,25])
$x\equiv4\!\pmod{5},\quad x\equiv1\!\pmod{12},\quad x\equiv7\!\pmod{14}$
DSTG.KTO_rucno([4,1,7],[5,12,14])
from sympy.ntheory.modular import solve_congruence
solve_congruence((4,5),(1,12),(7,14))
sm.ntheory.totient(17)
sm.ntheory.totient(28)
DSTG.ispis([sm.ntheory.totient(n) for n in range(1,51)],80)
figure(figsize=(12,8))
grid(True)
t=[sm.ntheory.totient(n) for n in range(1,51)]
plot(range(1,51),t,'o',markersize=8)
xticks(np.arange(0,51,2))
yticks(np.arange(0,50,5))
xlim([0,51]);
Kako dobiti listu svih prirodnih brojeva manjih od 100 koji su relativno prosti sa 100?
DSTG.ispis(list(filter(lambda n: np.gcd(100,n)==1,range(100))),80)
def reducirani_sustav_ostataka(m):
ostaci=list(filter(lambda n: np.gcd(m,n)==1,range(m)))
return ostaci
DSTG.ispis(reducirani_sustav_ostataka(100),80)
DSTG.ispis(reducirani_sustav_ostataka(1000),80)
Posljednje dvije znamenke broja $3^{502}\cdot7^{201}$ u njegovom dekadskom zapisu
(3**502*7**201)%100
Za veće potencije je bolje koristiti funkciju pow
%time pow(45,33333333,342)
red od 2 modulo 7 je jednak 3
sm.ntheory.n_order(2,7)
red od 16 modulo 29 je jednak 7
sm.ntheory.n_order(16,29)
red od 12 modulo 28 ne postoji
sm.ntheory.n_order(12,28)
Svi primitivni korijeni modulo 7
list(filter(lambda x: sm.ntheory.is_primitive_root(x,7), range(1,7)))
Svi primitivni korijeni modulo 41
list(filter(lambda x: sm.ntheory.is_primitive_root(x,41), range(1,41)))
Svi primitivni korijeni modulo 23
list(filter(lambda x: sm.ntheory.is_primitive_root(x,23), range(1,23)))
Svi primitivni korijeni modulo 50
list(filter(lambda x: sm.ntheory.is_primitive_root(x,50), reducirani_sustav_ostataka(50)))
primitivni korijen modulo $n$ generira reducirani sustav ostataka modulo $n$
reducirani_sustav_ostataka(23)
[pow(5,k,23) for k in range(sm.ntheory.totient(23))]
reducirani_sustav_ostataka(50)
[pow(3,k,50) for k in range(sm.ntheory.totient(50))]
[pow(37,k,50) for k in range(sm.ntheory.totient(50))]
$x^5\equiv2\!\pmod{7}$
list(filter(lambda x: pow(x,5,7)==2, range(7)))
$x^{12}\equiv37\!\pmod{41}$
list(filter(lambda x: pow(x,12,41)==37, range(41)))
$7^x\equiv6\!\pmod{17}$
list(filter(lambda x: pow(7,x,17)==6, range(17)))
$3^x\equiv2\!\pmod{23}$
list(filter(lambda x: pow(3,x,23)==2, range(23)))
$2x^8\equiv5\!\pmod{13}$
list(filter(lambda x: 2*pow(x,8,13)%13==5, range(13)))
$x^5\equiv2\!\pmod{12}$
list(filter(lambda x: pow(x,5,12)==2, range(12)))
$x^5\equiv4\!\pmod{12}$
list(filter(lambda x: pow(x,5,12)==4, range(12)))
sm.ntheory.primepi(100)
sm.ntheory.primepi(10000)
sm.ntheory.primepi(34.56)
sm.ntheory.primepi(np.pi**100)
sm.ntheory.primepi(np.pi**15)
DSTG.ispis([sm.ntheory.primepi(n) for n in range(1,50)],80)
DSTG.ispis([(n,sm.ntheory.primepi(n)) for n in range(1,50)],80)
figure(figsize=(12,8))
prvi=[sm.ntheory.primepi(n) for n in range(1,101)]
grid(True)
plot(range(1,101),prvi,'.',markersize=12)
xlim([0,101])
ylim([-1,27]);
figure(figsize=(12,8))
grid(True)
xx=np.arange(1.1,100.01,0.01)
plot(xx,xx/np.log(xx),linewidth=3.0,c='r')
xlim([0,110])
ylim([0,27]);
figure(figsize=(12,8))
prvi=[sm.ntheory.primepi(n) for n in range(1,101)]
grid(True)
plot(range(1,101),prvi,'.',markersize=12)
xx=np.arange(1.1,100.01,0.01)
plot(xx,xx/np.log(xx),linewidth=3.0,c='r')
xlim([0,110])
ylim([-1,27])
xlim([0,101]);
def teorem_prosti_brojevi(n):
prvi=[sm.ntheory.primepi(k) for k in range(1,n+1)]
grid(True)
plot(range(1,n+1),prvi,'.',markersize=10)
xx=np.arange(1.1,n+0.01,0.01)
plot(xx,xx/np.log(xx),linewidth=3.0,c='r');
figure(figsize=(12,8))
teorem_prosti_brojevi(1000)
figure(figsize=(12,8))
teorem_prosti_brojevi(10000)
figure(figsize=(12,8))
teorem_prosti_brojevi(100000)