Teorija brojeva u pythonu

In [1]:
import platform
In [2]:
platform.platform()
Out[2]:
'Linux-4.17.19-1-MANJARO-x86_64-with-arch-Manjaro-Linux'
In [3]:
platform.python_version()
Out[3]:
'3.7.0'
In [4]:
import sympy as sm
In [5]:
sm.__version__
Out[5]:
'1.3'
In [6]:
import numpy as np
In [7]:
np.__version__
Out[7]:
'1.15.2'
In [8]:
import itertools as it
In [9]:
import random as ran
In [10]:
from pylab import *
In [11]:
%matplotlib inline
In [12]:
import matplotlib
In [13]:
matplotlib.__version__
Out[13]:
'2.2.3'
In [14]:
import DSTG

Cjelobrojne funkcije

In [15]:
np.floor(5.23)
Out[15]:
5.0
In [16]:
sm.floor(5.23)
Out[16]:
5
In [17]:
np.ceil(5.23)
Out[17]:
6.0
In [18]:
sm.ceiling(5.23)
Out[18]:
6
In [19]:
np.floor(np.pi)
Out[19]:
3.0
In [20]:
sm.floor(sm.pi)
Out[20]:
3
In [21]:
np.ceil(np.pi)
Out[21]:
4.0
In [22]:
sm.ceiling(sm.pi)
Out[22]:
4
In [23]:
np.floor(-5.23)
Out[23]:
-6.0
In [24]:
sm.floor(-5.23)
Out[24]:
-6
In [25]:
np.ceil(-5.23)
Out[25]:
-5.0
In [26]:
sm.ceiling(-5.23)
Out[26]:
-5

Graf cjelobrojne funkcije $f(x)=\lfloor x\rfloor$

In [27]:
t = np.arange(-3.0, 3.0, 0.01)
grid(True)
plot(t,np.floor(t),linewidth=3.0,color='b')
ylim([-3,3]);
In [28]:
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$

In [29]:
t = np.arange(-3.0, 3.0, 0.01)
grid(True)
plot(t,np.ceil(t),linewidth=3.0,color='r')
ylim([-3,3]);
In [30]:
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

In [31]:
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')

Teorem o dijeljenju s ostatkom

In [32]:
500//17
Out[32]:
29
In [33]:
500%17
Out[33]:
7
In [34]:
-500//17
Out[34]:
-30
In [35]:
-500%17
Out[35]:
10

Neočekivani rezultati

In [36]:
500//-17
Out[36]:
-30
In [37]:
500%-17
Out[37]:
-10

Implementirane funkcije rade prema našim definicijama

In [38]:
DSTG.kvocijent(500,17)
Out[38]:
29
In [39]:
DSTG.ostatak(500,17)
Out[39]:
7
In [40]:
DSTG.kvocijent(500,-17)
Out[40]:
-29
In [41]:
DSTG.ostatak(500,-17)
Out[41]:
7
In [42]:
DSTG.ostatak(-500,0)
Out[42]:
'Error: dijeljenje s nulom'

Najveća zajednička mjera

In [43]:
np.gcd(30,18)
Out[43]:
6
In [44]:
sm.gcd(30,18)
Out[44]:
6
In [45]:
np.gcd(-30,18)
Out[45]:
6
In [46]:
sm.gcd(-30,18)
Out[46]:
6
In [47]:
np.gcd(-15,-17)
Out[47]:
1
In [48]:
sm.gcd(-15,-17)
Out[48]:
1
In [49]:
np.gcd(252,200)
Out[49]:
4
In [50]:
sm.gcd(252,200)
Out[50]:
4

Jedno cjelobrojno rješenje jednadžbe $252x+200y=M(252,200)$

In [51]:
sm.gcdex(252,200)
Out[51]:
(-23, 29, 4)
In [52]:
DSTG.euklid_rucno(252,200)
Out[52]:
 $-1$$0$$1$$2$$3$$4$
$r_i$$252$$200$$52$$44$$8$$4$
$q_i$  $1$$3$$1$$5$
$x_i$$1$$0$$1$$-3$$4$$-23$
$y_i$$0$$1$$-1$$4$$-5$$29$

Najmanji zajednički višekratnik

In [53]:
np.lcm(8,12)
Out[53]:
24
In [54]:
sm.lcm(8,12)
Out[54]:
24
In [55]:
np.lcm(252,200)
Out[55]:
12600
In [56]:
sm.lcm(252,200)
Out[56]:
12600
In [57]:
np.lcm(-8,12)
Out[57]:
24
In [58]:
sm.lcm(-8,12)
Out[58]:
24
In [59]:
np.lcm(np.lcm(12,5),14)
Out[59]:
420
In [60]:
sm.lcm_list([12,5,14])
Out[60]:
420

Prosti brojevi

Ispitivanje da li je broj prost

In [61]:
sm.isprime(1023)
Out[61]:
False
In [62]:
sm.isprime(17)
Out[62]:
True
In [63]:
list(map(lambda x: sm.isprime(x), [1023,17]))
Out[63]:
[False, True]

Ispitivanje prostosti velikih prirodnih brojeva pomoću Miller-Rabinovog testa

In [64]:
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.

In [65]:
DSTG.ispis(p1,80)
34456397589318178483193961861418681732532956950966306724399147541674421192532802
44428908154920869726595158393759837147338630142695163240144006171562822314812103
85535561553370650830273418610809943200210604056519158826545418459033775935334392
71928526067763429496448150117276833594446863632109641941627491249235882339404373
225948839135854099741607213
In [66]:
sm.isprime(p1)
Out[66]:
False
In [67]:
sm.ntheory.primetest.mr(p1,[ran.randint(1,p1) for k in range(20)])
Out[67]:
False
In [68]:
DSTG.ispis(p2,80)
61891877833615477421686119892898221933456590431423859297204193967168190790508503
91866587613360191697781426882837267847070391840859840409575246788630975374996053
71139819267962214566771628824475500946906431567899409728135894658093621364380223
41860444076132002396099380469351796632661456405409514592442838581177167864224964
69004783238606021089477784274673593366115151789172380229657411599720336465423662
7418562565428565504384750523961420396693212696808419

Broj $\ p_2$ je vjerojatno prosti broj. Test se ponavlja po defaultu $20$ puta.

In [69]:
sm.isprime(p2)
Out[69]:
True
In [70]:
sm.ntheory.primetest.mr(p2,[ran.randint(1,p2) for k in range(20)])
Out[70]:
True

Broj $\ p_2$ je vjerojatno prosti broj s još većom vjerojatnošću. Ovaj put se test ponavlja $30$ puta.

In [71]:
sm.ntheory.primetest.mr(p2,[ran.randint(1,p2) for k in range(30)])
Out[71]:
True

Rastav broja na proste faktore

In [72]:
sm.ntheory.factorint(40)
Out[72]:
{2: 3, 5: 1}
In [73]:
sm.ntheory.factorint(4063)
Out[73]:
{17: 1, 239: 1}
In [74]:
sm.ntheory.factorint(10468)
Out[74]:
{2: 2, 2617: 1}
In [75]:
sm.ntheory.factorint(10**30+1)
Out[75]:
{61: 1, 101: 1, 3541: 1, 9901: 1, 27961: 1, 4188901: 1, 39526741: 1}

Djelitelji prirodnog broja

In [76]:
sm.ntheory.divisors(40)
Out[76]:
[1, 2, 4, 5, 8, 10, 20, 40]
In [77]:
sm.ntheory.divisors(4063)
Out[77]:
[1, 17, 239, 4063]
In [78]:
sm.ntheory.divisors(10468)
Out[78]:
[1, 2, 4, 2617, 5234, 10468]
In [79]:
DSTG.ispis(sm.ntheory.divisors(10**30+1),80)
[1, 61, 101, 3541, 6161, 9901, 27961, 216001, 357641, 603961, 1000001, 1705621, 
2824061, 4188901, 21816101, 35059441, 39526741, 61000061, 99009901, 172267721, 2
55522961, 276841861, 423079001, 2138625901, 2411131201, 3541003541, 3992200841, 
6039603961, 10000000001, 14832898441, 16887353521, 25807819061, 27961027961, 414
74308801, 117125860861, 139964189881, 216001216001, 243524251301, 391354262641, 
610000000061, 904806804901, 980297029801, 1105207205101, 1498122742541, 17056227
05621, 2529932836861, 4188905188901, 7144677512521, 8537815582741, 1182971194696
1, 14136383177981, 23872610021101, 39526780526741, 59798118817861, 6741763951116
1, 91385487295001, 99010000009901, 111625927715201, 146860527464341, 16557360490
1641, 255523216522961, 414742673308801, 721612428764621, 862319373856841, 115966
3148384761, 1385785444011781, 2411133612131201, 3913538713262641, 60396100006039
61, 6809181590627261, 8958492175324801, 10099989899000101, 10942656537705001, 14
832913273898441, 16722934095065741, 25299303071836861, 41889010004188901, 707394
52051470421, 84532912084718641, 117125977986860861, 139964329845189881, 23872586
1509021101, 395267410039526741, 586296134956710781, 667502048800005061, 90480770
9707804901, 1020098979799010201, 1105208310308205101, 1639344262131147541, 25552
29610255522961, 4106367208430438701, 4629603566654784001, 7144684657198512521, 8
537824120556582741, 24111312012411131201, 35764064232359357641, 3874794680001340
8541, 59215909630627788881, 67417706928800511161, 99999999990000000001, 16557377
0475245901641, 250488399714256760761, 282405817565941824061, 4147430880514743088
01, 467589960232133184101, 2363624754800817921001, 3612170487468295121741, 39135
42626801354262641, 5804918032206393442681, 10099999998990000000101, 163934262295
24590147541, 25299328371139932836861, 28522987574160124230161, 45837704913449016
393901, 238726100234882610021101, 354099999964590000003541, 58629672125284573771
0781, 999999000000999999000001, 1655736049181983604901641, 279609999972039000002
7961, 4629608196258350655784001, 35764099996423590000357641, 1009998990001009998
99000101, 162311313098522967050803441, 282406099971759390002824061, 990099009900
9900990099009901, 16393442622950819672131147541, 1000000000000000000000000000001
]

Prosti djelitelji prirodnog broja

In [80]:
sm.ntheory.primefactors(40)
Out[80]:
[2, 5]
In [81]:
sm.ntheory.primefactors(4063)
Out[81]:
[17, 239]
In [82]:
sm.ntheory.primefactors(10468)
Out[82]:
[2, 2617]
In [83]:
sm.ntheory.primefactors(10**30+1)
Out[83]:
[61, 101, 3541, 9901, 27961, 4188901, 39526741]

Skup prostih brojeva

In [84]:
sm.sieve._list
Out[84]:
array('l', [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621])
In [85]:
17 in sm.sieve
Out[85]:
True
In [86]:
25 in sm.sieve
Out[86]:
False
In [87]:
1047 in sm.sieve
Out[87]:
False
In [88]:
sm.isprime(17981)
Out[88]:
True
In [89]:
17981 in sm.sieve
Out[89]:
True

proširenje sita do svih prostih brojeva manjih ili jednakih od 20000

In [90]:
sm.sieve.extend(20000)
In [91]:
sm.sieve._list
Out[91]:
array('l', [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997])
In [92]:
17981 in sm.sieve
Out[92]:
True

Prvih 30 prostih brojeva

In [93]:
DSTG.ispis([sm.ntheory.prime(n) for n in range(1,31)],80)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,
 79, 83, 89, 97, 101, 103, 107, 109, 113]
In [94]:
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]);
In [95]:
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]);

Deseti po redu prosti broj

In [96]:
sm.ntheory.prime(10)
Out[96]:
29

Svi prosti brojevi između $41$ i $200$

In [97]:
DSTG.ispis(list(sm.ntheory.primerange(41,201)),80)
[41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 12
7, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]

Svi brojevi između $41$ i $200$ koji su potencije prostog broja

In [98]:
DSTG.ispis(list(filter(lambda x: len(sm.ntheory.primefactors(x))==1,range(41,201))),80)
[41, 43, 47, 49, 53, 59, 61, 64, 67, 71, 73, 79, 81, 83, 89, 97, 101, 103, 107, 
109, 113, 121, 125, 127, 128, 131, 137, 139, 149, 151, 157, 163, 167, 169, 173, 
179, 181, 191, 193, 197, 199]

Najmanji prosti broj veći od $n$

In [99]:
sm.ntheory.nextprime(100)
Out[99]:
101
In [100]:
sm.ntheory.nextprime(31)
Out[100]:
37
In [101]:
sm.ntheory.nextprime(44)
Out[101]:
47
In [102]:
sm.ntheory.nextprime(2**100)
Out[102]:
1267650600228229401496703205653

Najveći prosti broj manji od $n$

In [103]:
sm.ntheory.prevprime(100)
Out[103]:
97
In [104]:
sm.ntheory.prevprime(31)
Out[104]:
29
In [105]:
sm.ntheory.prevprime(44)
Out[105]:
43
In [106]:
sm.ntheory.prevprime(2**100)
Out[106]:
1267650600228229401496703205361

Prosti brojevi manji od $1000$

In [107]:
DSTG.ispis(list(sm.ntheory.primerange(1,1000)),80)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,
 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163
, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251
, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349
, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443
, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557
, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647
, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757
, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863
, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983
, 991, 997]

Slučajni prosti broj s $n$ znamenaka

In [108]:
sm.ntheory.randprime(1,10**2)
Out[108]:
13
In [109]:
sm.ntheory.randprime(1,10**2)
Out[109]:
17
In [110]:
sm.ntheory.randprime(1,10**10)
Out[110]:
6308890127

Slučajni prosti broj između 5002 i 23421

In [111]:
sm.ntheory.randprime(5002,23421)
Out[111]:
10667

Dva slučajna prosta broja za RSA kriptosustav

In [112]:
p=sm.ntheory.randprime(1,10**200)
In [113]:
q=sm.ntheory.randprime(1,10**200)
In [114]:
DSTG.ispis(p,80)
55142986829216565592633534720309242504289939150640499523956195897381866786081789
53916273013929233225971549409586682374677270896004277655327626982194561035526024
175965669025182127461918751034526404769
In [115]:
DSTG.ispis(q,80)
12081630776907147865813499449780401449011996364972911373330482657655795944707471
91290876827688584248456938916512029325042316642911010404504833003337938422420765
7519840410562678467609183258962986811289
In [116]:
DSTG.ispis(p*q,80)
66621720680644835764968970851135826726165832001996784971193127015369707242134551
80149722937548254748721730516090909337663038757061031127601505776957721222173708
78701293753011925320991713605403596259900963638214721270994557139232746950085750
08112427332411391465640344333153793881629383446203507997978174315150349620243901
397566119961426153605238163835337526252123526449972371703542209874772632637241
In [117]:
p1=sm.ntheory.randprime(2**639,2**640)
In [118]:
q1=sm.ntheory.randprime(2**639,2**640)
In [119]:
DSTG.ispis(p1,80)
41990063666023853982665227840044670483999235845985889854259193225355127092002752
70563685368779515821251282199141898785064516848527301217089827829170812601645275
214612209396116394776619882314383
In [120]:
DSTG.ispis(q1,80)
39946818995347010959964891739964331525569375561940229769625072135778006718087556
04717504054939551921879743776706417659020439511155172698745231089058410866319689
784778357094444123410014867112333
In [121]:
DSTG.ispis(p1*q1,80)
16773694728697520386995715830860227084660918352040467633747422075652536107415126
41551633739439861399505691493624252562563884173394891915377116542247965333686164
56924612156690915503356987569937466099975008565502344034078311359726748622074146
08580561847311154800318017568729662950321786498651716262258035692682428128849844
304362518316903260794188826746509341137225351452238439172082585539

Linearne kongruencije

$15x\equiv1\!\pmod{341}\qquad$ rješenje: $x=91$

In [122]:
DSTG.lin_kong_rucno(15,1,341,izlaz='rjecnik')
Out[122]:
{'qi': [22, 1, 2, 1],
 'yi': [0, 1, -22, 23, -68, 91],
 'a1b1d1': [15, 1, 341],
 'rjesenja': [91]}
In [123]:
DSTG.lin_kong_rucno(15,1,341)
Out[123]:
 $-1$$0$$1$$2$$3$$4$rjesenja
$q_i$  $22$$1$$2$$1$$[91]$
$y_i$$0$$1$$-22$$23$$-68$$91$$(a_1,b_1,n_1)=(15,1,341)$

$10x\equiv1\!\pmod{12}\qquad$ nema rješenja

In [124]:
DSTG.lin_kong_rucno(10,1,12)
Out[124]:
False

$79x\equiv15\!\pmod{722}\qquad$ rješenje: $x=119$

In [125]:
DSTG.lin_kong_rucno(79,15,722,izlaz='rjecnik')
Out[125]:
{'qi': [9, 7, 5],
 'yi': [0, 1, -9, 64, -329],
 'a1b1d1': [79, 15, 722],
 'rjesenja': [119]}
In [126]:
DSTG.lin_kong_rucno(79,15,722)
Out[126]:
 $-1$$0$$1$$2$$3$rjesenja
$q_i$  $9$$7$$5$$[119]$
$y_i$$0$$1$$-9$$64$$-329$$(a_1,b_1,n_1)=(79,15,722)$

$155x\equiv1185\!\pmod{1405}\qquad$ rješenja: $x=198, 479, 760, 1041, 1322$

In [127]:
DSTG.lin_kong_rucno(155,1185,1405,izlaz='rjecnik')
Out[127]:
{'qi': [9, 15],
 'yi': [0, 1, -9, 136],
 'a1b1d1': [31, 237, 281],
 'rjesenja': [198, 479, 760, 1041, 1322]}
In [128]:
DSTG.lin_kong_rucno(155,1185,1405)
Out[128]:
 $-1$$0$$1$$2$rjesenja
$q_i$  $9$$15$$[198, 479, 760, 1041, 1322]$
$y_i$$0$$1$$-9$$136$$(a_1,b_1,n_1)=(31,237,281)$

Kineski teorem o ostacima

$x\equiv1\!\pmod{4},\quad x\equiv8\!\pmod{9},\quad x\equiv10\!\pmod{25}$

In [129]:
from sympy.ntheory.modular import crt
crt([4,9,25],[1,8,10])
Out[129]:
(mpz(485), 900)

$x\equiv4\!\pmod{5},\quad x\equiv1\!\pmod{12},\quad x\equiv7\!\pmod{77}$

In [130]:
crt([5,12,77],[4,1,7])
Out[130]:
(mpz(469), 4620)

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}$

In [131]:
DSTG.KTO_rucno([1,8,10],[4,9,25],izlaz='rjecnik')
Out[131]:
{'n': 900, 'k_i': [225, 100, 36], 'x_i': [1, 8, 10], 'x0': 1385, 'x0_mod': 485}
In [132]:
DSTG.KTO_rucno([1,8,10],[4,9,25])
Out[132]:
 $1$$2$$3$
$k_i$$225$$100$$36$
$x_i$$1$$8$$10$
$x_0$$1385$
$x_0$-mod$485$
$n$$900$

$x\equiv4\!\pmod{5},\quad x\equiv1\!\pmod{12},\quad x\equiv7\!\pmod{14}$

In [133]:
DSTG.KTO_rucno([4,1,7],[5,12,14])
Out[133]:
'Error: moduli nisu u parovima relativno prosti.'
In [134]:
from sympy.ntheory.modular import solve_congruence
solve_congruence((4,5),(1,12),(7,14))
Out[134]:
(49, 420)

Eulerova funkcija

In [135]:
sm.ntheory.totient(17)
Out[135]:
16
In [136]:
sm.ntheory.totient(28)
Out[136]:
12
In [137]:
DSTG.ispis([sm.ntheory.totient(n) for n in range(1,51)],80)
[1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8, 12, 10, 22, 8, 
20, 12, 18, 12, 28, 8, 30, 16, 20, 16, 24, 12, 36, 18, 24, 16, 40, 12, 42, 20, 2
4, 22, 46, 16, 42, 20]
In [138]:
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?

In [139]:
DSTG.ispis(list(filter(lambda n: np.gcd(100,n)==1,range(100))),80)
[1, 3, 7, 9, 11, 13, 17, 19, 21, 23, 27, 29, 31, 33, 37, 39, 41, 43, 47, 49, 51,
 53, 57, 59, 61, 63, 67, 69, 71, 73, 77, 79, 81, 83, 87, 89, 91, 93, 97, 99]
In [140]:
def reducirani_sustav_ostataka(m): 
    ostaci=list(filter(lambda n: np.gcd(m,n)==1,range(m))) 
    return ostaci
In [141]:
DSTG.ispis(reducirani_sustav_ostataka(100),80)
[1, 3, 7, 9, 11, 13, 17, 19, 21, 23, 27, 29, 31, 33, 37, 39, 41, 43, 47, 49, 51,
 53, 57, 59, 61, 63, 67, 69, 71, 73, 77, 79, 81, 83, 87, 89, 91, 93, 97, 99]
In [142]:
DSTG.ispis(reducirani_sustav_ostataka(1000),80)
[1, 3, 7, 9, 11, 13, 17, 19, 21, 23, 27, 29, 31, 33, 37, 39, 41, 43, 47, 49, 51,
 53, 57, 59, 61, 63, 67, 69, 71, 73, 77, 79, 81, 83, 87, 89, 91, 93, 97, 99, 101
, 103, 107, 109, 111, 113, 117, 119, 121, 123, 127, 129, 131, 133, 137, 139, 141
, 143, 147, 149, 151, 153, 157, 159, 161, 163, 167, 169, 171, 173, 177, 179, 181
, 183, 187, 189, 191, 193, 197, 199, 201, 203, 207, 209, 211, 213, 217, 219, 221
, 223, 227, 229, 231, 233, 237, 239, 241, 243, 247, 249, 251, 253, 257, 259, 261
, 263, 267, 269, 271, 273, 277, 279, 281, 283, 287, 289, 291, 293, 297, 299, 301
, 303, 307, 309, 311, 313, 317, 319, 321, 323, 327, 329, 331, 333, 337, 339, 341
, 343, 347, 349, 351, 353, 357, 359, 361, 363, 367, 369, 371, 373, 377, 379, 381
, 383, 387, 389, 391, 393, 397, 399, 401, 403, 407, 409, 411, 413, 417, 419, 421
, 423, 427, 429, 431, 433, 437, 439, 441, 443, 447, 449, 451, 453, 457, 459, 461
, 463, 467, 469, 471, 473, 477, 479, 481, 483, 487, 489, 491, 493, 497, 499, 501
, 503, 507, 509, 511, 513, 517, 519, 521, 523, 527, 529, 531, 533, 537, 539, 541
, 543, 547, 549, 551, 553, 557, 559, 561, 563, 567, 569, 571, 573, 577, 579, 581
, 583, 587, 589, 591, 593, 597, 599, 601, 603, 607, 609, 611, 613, 617, 619, 621
, 623, 627, 629, 631, 633, 637, 639, 641, 643, 647, 649, 651, 653, 657, 659, 661
, 663, 667, 669, 671, 673, 677, 679, 681, 683, 687, 689, 691, 693, 697, 699, 701
, 703, 707, 709, 711, 713, 717, 719, 721, 723, 727, 729, 731, 733, 737, 739, 741
, 743, 747, 749, 751, 753, 757, 759, 761, 763, 767, 769, 771, 773, 777, 779, 781
, 783, 787, 789, 791, 793, 797, 799, 801, 803, 807, 809, 811, 813, 817, 819, 821
, 823, 827, 829, 831, 833, 837, 839, 841, 843, 847, 849, 851, 853, 857, 859, 861
, 863, 867, 869, 871, 873, 877, 879, 881, 883, 887, 889, 891, 893, 897, 899, 901
, 903, 907, 909, 911, 913, 917, 919, 921, 923, 927, 929, 931, 933, 937, 939, 941
, 943, 947, 949, 951, 953, 957, 959, 961, 963, 967, 969, 971, 973, 977, 979, 981
, 983, 987, 989, 991, 993, 997, 999]

Posljednje dvije znamenke broja $3^{502}\cdot7^{201}$ u njegovom dekadskom zapisu

In [143]:
(3**502*7**201)%100
Out[143]:
63

Za veće potencije je bolje koristiti funkciju pow

In [144]:
%time pow(45,33333333,342)
CPU times: user 9 µs, sys: 1e+03 ns, total: 10 µs
Wall time: 12.2 µs
Out[144]:
153

Red od $a$ modulo $n$

red od 2 modulo 7 je jednak 3

In [145]:
sm.ntheory.n_order(2,7)
Out[145]:
3

red od 16 modulo 29 je jednak 7

In [146]:
sm.ntheory.n_order(16,29)
Out[146]:
7

red od 12 modulo 28 ne postoji

In [147]:
sm.ntheory.n_order(12,28)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-147-4e3ba519d331> in <module>()
----> 1 sm.ntheory.n_order(12,28)

/usr/lib/python3.7/site-packages/sympy/ntheory/residue_ntheory.py in n_order(a, n)
     32     a, n = as_int(a), as_int(n)
     33     if igcd(a, n) != 1:
---> 34         raise ValueError("The two numbers should be relatively prime")
     35     factors = defaultdict(int)
     36     f = factorint(n)

ValueError: The two numbers should be relatively prime

Primitivni korijen modulo $p$

Svi primitivni korijeni modulo 7

In [148]:
list(filter(lambda x: sm.ntheory.is_primitive_root(x,7), range(1,7)))
Out[148]:
[3, 5]

Svi primitivni korijeni modulo 41

In [149]:
list(filter(lambda x: sm.ntheory.is_primitive_root(x,41), range(1,41)))
Out[149]:
[6, 7, 11, 12, 13, 15, 17, 19, 22, 24, 26, 28, 29, 30, 34, 35]

Svi primitivni korijeni modulo 23

In [150]:
list(filter(lambda x: sm.ntheory.is_primitive_root(x,23), range(1,23)))
Out[150]:
[5, 7, 10, 11, 14, 15, 17, 19, 20, 21]

Svi primitivni korijeni modulo 50

In [151]:
list(filter(lambda x: sm.ntheory.is_primitive_root(x,50), reducirani_sustav_ostataka(50)))
Out[151]:
[3, 13, 17, 23, 27, 33, 37, 47]

primitivni korijen modulo $n$ generira reducirani sustav ostataka modulo $n$

In [152]:
reducirani_sustav_ostataka(23)
Out[152]:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
In [153]:
[pow(5,k,23) for k in range(sm.ntheory.totient(23))]
Out[153]:
[1, 5, 2, 10, 4, 20, 8, 17, 16, 11, 9, 22, 18, 21, 13, 19, 3, 15, 6, 7, 12, 14]
In [154]:
reducirani_sustav_ostataka(50)
Out[154]:
[1, 3, 7, 9, 11, 13, 17, 19, 21, 23, 27, 29, 31, 33, 37, 39, 41, 43, 47, 49]
In [155]:
[pow(3,k,50) for k in range(sm.ntheory.totient(50))]
Out[155]:
[1, 3, 9, 27, 31, 43, 29, 37, 11, 33, 49, 47, 41, 23, 19, 7, 21, 13, 39, 17]
In [156]:
[pow(37,k,50) for k in range(sm.ntheory.totient(50))]
Out[156]:
[1, 37, 19, 3, 11, 7, 9, 33, 21, 27, 49, 13, 31, 47, 39, 43, 41, 17, 29, 23]

Nelinearne kongruencije

$x^5\equiv2\!\pmod{7}$

In [157]:
list(filter(lambda x: pow(x,5,7)==2, range(7)))
Out[157]:
[4]

$x^{12}\equiv37\!\pmod{41}$

In [158]:
list(filter(lambda x: pow(x,12,41)==37, range(41)))
Out[158]:
[2, 18, 23, 39]

$7^x\equiv6\!\pmod{17}$

In [159]:
list(filter(lambda x: pow(7,x,17)==6, range(17)))
Out[159]:
[13]

$3^x\equiv2\!\pmod{23}$

In [160]:
list(filter(lambda x: pow(3,x,23)==2, range(23)))
Out[160]:
[7, 18]

$2x^8\equiv5\!\pmod{13}$

In [161]:
list(filter(lambda x: 2*pow(x,8,13)%13==5, range(13)))
Out[161]:
[2, 3, 10, 11]

$x^5\equiv2\!\pmod{12}$

In [162]:
list(filter(lambda x: pow(x,5,12)==2, range(12)))
Out[162]:
[]

$x^5\equiv4\!\pmod{12}$

In [163]:
list(filter(lambda x: pow(x,5,12)==4, range(12)))
Out[163]:
[4, 10]

Funkcija $\pi(x)$

In [164]:
sm.ntheory.primepi(100)
Out[164]:
25
In [165]:
sm.ntheory.primepi(10000)
Out[165]:
1229
In [166]:
sm.ntheory.primepi(34.56)
Out[166]:
11
In [167]:
sm.ntheory.primepi(np.pi**100)
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-167-93327645b79b> in <module>()
----> 1 sm.ntheory.primepi(np.pi**100)

/usr/lib/python3.7/site-packages/sympy/ntheory/generate.py in primepi(n)
    454         lim += 1
    455     lim-=1
--> 456     arr1 = [0] * (lim + 1)
    457     arr2 = [0] * (lim + 1)
    458     for i in range(1, lim + 1):

OverflowError: cannot fit 'int' into an index-sized integer
In [168]:
sm.ntheory.primepi(np.pi**15)
Out[168]:
1779830
In [169]:
DSTG.ispis([sm.ntheory.primepi(n) for n in range(1,50)],80)
[0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9
, 9, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15,
 15, 15]
In [170]:
DSTG.ispis([(n,sm.ntheory.primepi(n)) for n in range(1,50)],80)
[(1, 0), (2, 1), (3, 2), (4, 2), (5, 3), (6, 3), (7, 4), (8, 4), (9, 4), (10, 4)
, (11, 5), (12, 5), (13, 6), (14, 6), (15, 6), (16, 6), (17, 7), (18, 7), (19, 8
), (20, 8), (21, 8), (22, 8), (23, 9), (24, 9), (25, 9), (26, 9), (27, 9), (28, 
9), (29, 10), (30, 10), (31, 11), (32, 11), (33, 11), (34, 11), (35, 11), (36, 1
1), (37, 12), (38, 12), (39, 12), (40, 12), (41, 13), (42, 13), (43, 14), (44, 1
4), (45, 14), (46, 14), (47, 15), (48, 15), (49, 15)]

Teorem o prostim brojevima

In [171]:
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]);
In [172]:
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]);
In [173]:
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]);
In [174]:
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');
In [175]:
figure(figsize=(12,8))
teorem_prosti_brojevi(1000)
In [176]:
figure(figsize=(12,8))
teorem_prosti_brojevi(10000)
In [177]:
figure(figsize=(12,8))
teorem_prosti_brojevi(100000)
In [ ]: