(%i1) for i:1 thru 30 do (if mod(30,i)=0 then print(i));
Obtindrem ràpidament tots el divisors: {1, 2, 3, 5, 6, 10, 15, 30}
Potser convindreu que no té molt d'interès perquè, de fet, el nombre que hem posat és molt petit. Ara bé, i si fos, posem pel cas, 1452 ? Deu n'hi do de la feinada que tindrem si ho fem amb paper i llapis, fins i tot, fent-ho d'una manera exhaustiva amb l'ajut d'un diagrama d'arbre tal com vaig explicar en un article anterior. Modificant la dada, obtindrem el resultat amb un dit i fet
    (%i2) for i:1 thru 1452 do (if mod(1452,i)=0 then print(i));
... 1 2 3 4 6 11 12 22 33 44 66 121 132 242 363 484 726 1452
I encara molt millor si escrivim una funció amb un paràmetre d'entrada per no haver d'escriure cada vegada la instrucció repetitiva:
    (%i3) troba_divisors(n):=(
for i:1 thru n do (if mod(n,i)=0 then print(i))
)$
Funció que farem servir concretant el nombre del qual volem trobar els divisors:
    (%i4) troba_divisors(235456);
Aquest és el resultat del càlcul:
1 2 4 8 13 16 26 32 52 64 104 208 283 416 566 832 1132 2264 3679 4528 7358 9056 14716 18112 29432 58864 117728 235456
Val a dir, però, que MAXIMA disposa ja d'una funció predefinida divisors(). No cal programar-ne un altra. El que m'ha mogut a escriure-la és només per exposar un exercici elemental de programació. La funció predefinida és més eficaç que la que he escrit perquè l'algorisme emprat per MAXIMA és molt millor. Comproveu-ho. Us adonareu que el resultat amb la funció divisors() s'obté molt més ràpidament i, a més, estructurat com una llista:
    (%i5) divisors(235456);
    (%o5){1,2,4,8,13,16,26,32,52,64,104,208,283,416,566,832,
1132,2264,3679,4528,7358,9056,14716,18112,29432,58864,117728,235456}
[autoría]
No hay comentarios:
Publicar un comentario
Gracias por tus comentarios