jueves, 25 de agosto de 2022

Divisors d'un nombre enter no negatiu. Un exercici de programació amb l'eina GNU MAXIMA

    Si us agrada programar una mica és un bon exercici escriure una senzilla línia d'instruccions amb MAXIMA per escriure la llista de nombres divisors d'un nombre enter no negatiu donat:
    (%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}

$\diamond$

No hay comentarios:

Publicar un comentario