Autor |
Mesaj |
|
Doresc sa rezolv urmatoarea problema in Sagemath:
Determinati numerele naturale x (x< 1000) stiind ca :
Am incercat urmatoarea varianta fara succes:
sage:x=0
sage: while x<1000:
if (125+5*x)%23==0:
print x,
x=x+1
|
|
Citind documentatia si experimentand, am gasit raspunsul:
sage: for x in range(1000):
....: if (125+5*x)%23==0:
....: print x,
....:
21 44 67 90 113 136 159 182 205 228 251 274 297 320 343 366 389 412 435 458 481 504 527 550 573 596 619 642 665 688 711 734 757 780 803 826 849 872 895 918 941 964 987
|
|
[Citat] Citind documentatia si experimentand, am gasit raspunsul:
sage: for x in range(1000):
....: if (125+5*x)%23==0:
....: print x,
....:
21 44 67 90 113 136 159 182 205 228 251 274 297 320 343 366 389 412 435 458 481 504 527 550 573 596 619 642 665 688 711 734 757 780 803 826 849 872 895 918 941 964 987
|
Abia acum am vazut postarea.
Solutia de mai sus este buna.
Scriu cateva cuvinte despre ceea ce fac eu in astfel de cazuri. Uneori prefer sa iau (in sage, nu in python) in loc de range constructia mai aproape de matematica cu un fel de intervale.
range( 1000 )
se poate inlocui (fara schimbari in rulare) cu [ 0 .. 999 ] , lista numerelor de la 0 la 999 (inclusiv).
Daca ar fi fost 10000000 in loc de 1000, atunci trebuie sa folosim xrange.
Lucrand cu [ 0 .. 999 ] avem deja in mana intregi-sage, de exemplu:
sage: for k in [ 0 .. 2 ]: print k, type(k)
0 <type 'sage.rings.integer.Integer'>
1 <type 'sage.rings.integer.Integer'>
2 <type 'sage.rings.integer.Integer'>
si este o mare deosebire intre 2-ul din python si 2-ul de mai sus, care este mai degraba ZZ(2). (A se tipari a=2, apoi pe linia urmatoare a.TAB - vine lista metodelor ce le putem aplica lui 2. De exemplu:
sage: a = 2
sage: a.is_prime()
True
sage: a.parent()
Integer Ring
2-ul din range sau xrange este un 'int' ...)
Apoi ecuatia
( 125 + 5*x ) % 23 == 0
o rezolvam cel mai bine in corpul cu 23 de elemente:
x-ul este desigur -125 / 5 = -25 = -2 = 21 .
Putem factoriza de la inceput, vazand ca 5 si 23 sunt prime intre ele... dar si altfel, putem incerca:
sage: F = GF( 23 )
sage: F( -125 ) / F(5)
21
sage: _.parent()
Finite Field of size 23
Este bine de stiut ca se poate folosi "list comprehension", este exact modul in care matematicienii scriu multimile. (Aici dam de o lista...)
print [ x for x in range( 1000 ) if ( 125 + 5*x ) % 23 == 0 ]
ne da
sage: print [ x for x in range( 1000 ) if ( 125 + 5*x ) % 23 == 0 ]
[21, 44, 67, 90, 113, 136, 159, 182, 205, 228, 251, 274, 297, 320, 343, 366, 389, 412, 435, 458, 481, 504, 527, 550, 573, 596, 619, 642, 665, 688, 711, 734, 757, 780, 803, 826, 849, 872, 895, 918, 941, 964, 987]
sage:
(spatierea ajuta la citit...)
(de obicei salvam lista in ceva, nu vrem sa o printam...)
--- df (gauss)
|
|
Va multumesc pentru informatii.
|
|
Va rog sa-mi spuneti cum sa procedez pentru ca Sage sa genereze numerele de forma
.
In situatia in care numarul ar fi de forma
atunci se poate utiliza:
print[a for a in [0..9] if (7000+111*a)%7==0]
[0, 7]
si se afla cifra a pentru care
.
Nu stiu cum sa procedez daca cifrele sunt diferite. Multumesc.
|
|
Dupa mai multe incercari am gasit o solutie:
sage: print [a for a in [7000..7999] if a%360==0]
[7200, 7560, 7920]
|
|
Domnule profesor Gauss va rog sa-mi spuneti daca este posibil sa determinam in Sage Math domeniile de definitie maxime si imaginile functiilor:
.
|
|
[Citat] Domnule profesor Gauss va rog sa-mi spuneti daca este posibil sa determinam in Sage Math domeniile de definitie maxime si imaginile functiilor:
. |
Nu mi-am pus niciodata problema de a cere programatic / prin cod domeniul maxim de definitie pentru o functie, pentru f-ul si pentru g-ul de mai sus sage stie si numere complexe, asa ca este de datoria programatorului sa explice prin cod ce vrea.
Vrem maxim si minim, deci luam functiile de la IR (fara poli) la IR.
(Plotarea rezolva multe astfel de probleme. Fara...)
Daca chiar vrem max si min pe un interval, exista o utilitate numerica ce poate fi de ajutor in astfel de cazuri. Raspunsul este doar aproximativ, dar pentru mine suficient (cand il cer asa).
sage: f(x) = x / (x^2-1)
sage: g(x) = exp( x^2 )
sage: f.find_local_minimum ?
sage: f.find_local_maximum ?
sage: f.find_local_minimum( 1, 100 )
(0.010001000323734516, 99.999997763425981)
sage: f.find_local_maximum( 1, 100 )
(12816771.112462174, 1.0000000390113863)
sage: g.find_local_minimum( -5, 5 )
(1.0, 9.8666660737060122e-09)
sage: g.find_local_maximum( -5, 5 )
(72004822993.24107, -4.999999893973623)
Deci
-- f ia un minim numeric de zero virgula ceva pe intervalul [ 1, 100 ] spre capatul cu 100. (Ne asteptam sa avem o asimptotica spre zero...)
-- f ia un maxim numeric mare pe intervalul [ 1, 100 ] spre capatul cu 1 00 (EDIT: am copiat prea mult..).
-- g ia un minim numeric de valoare 1 [ -5, 5 ] pe langa zero.
-- g ia un maxim numeric mare pe intervalul [ -5, 5 ] spre capatul cu -5.
Desigur ca un plot ajuta mai mult...
Mai mult nu stiu.
--- df (gauss)
|
|
Va multumesc pentru raspuns.
|