Programació Paral·lela Laboratori de Pràctiques Curs 2020-21 • Introducció Un cop fets els exercicis de problemes, us plantegem un problema una mica més complex basat en un parell de definicions matemàtiques: a. Divisors propis d’un número natural: són tots els factors del número, excepte el propi número (p. ex. els divisors propis de 12 són 1, 2, 3, 4 i 6). b. Suma alíquota d’un número natural: es denota com a 𝜎(𝑛) i es calcula com la suma dels divisors propis d’n. c. Números amics (amicables): són dos números x i y tal que 𝜎(𝑥) és igual a y i 𝜎(𝑦)és igual a x (noteu que és similar però no igual a la definició de números amigables que heu treballat en les sessions de problemes). d. Números perfectes: són aquells números naturals que compleixen 𝜎(𝑛) = 𝑛. La idea general d’aquest laboratori és la de fer un programa en c que trobi totes les parelles de números amics i tots els números perfectes dins d’un cert rang de números naturals donat. • Descripció del Problema El programa a desenvolupar rebrà per línia de comandes (arguments al main) els límits inferior (low) i superior (high) del rang a tractar ([low,high]). En primer lloc haurà de validar que aquests arguments siguin correctes: low i high > 2 i high >= low. Un cop fet això procedireu a fer la cerca de les parelles de números amics i la llista de números perfectes dins del rang. Els primers els emmagatzemareu en una matriu de dues files i tantes columnes com siguin necessàries, mentre que els segons els emmagatzemareu en un array. Finalment, mostrareu els resultats trobat per pantalla, fent servir les estructures creades. Com d’entrada no sabeu quantes parelles de números amics i quants números perfectes trobareu en el rang indicat, caldrà que reserveu de forma dinàmica aquestes dues estructures de dades fent servir com a guia el número d’elements al rang (highlow+1). En principi, les mateixes seran reduïdes, ja que, per exemple, el nombre de parelles de números amics en el rang [2,10240] és de 5 i el de números perfectes és de 4. L’algorisme per trobar les parelles de números amics i la llista de números perfectes l’heu de dissenyar vosaltres, però us fem algunes consideracions inicials: • Si es dissenya una solució de força bruta (fet tots els càlculs necessaris per cada parella de números considerats) aquest és un problema molt intensiu de còmput • (p. ex. trobar les 5 parelles en el rang [2,10240] ha trigat aproximadament 6 minuts en un processador i5). Ara bé, en aquest cas no es fa servir gens de memòria. Si es dissenya una solució més intel·ligent (es pre-calculen les alíquotes de tots els números dins del rang), el problema pot requerir una quantitat de memòria relativament important (4x(high-low+1) Bytes) que caldrà reservar de forma dinàmica, però el còmput s’accelera de forma espectacular (p. ex. trobar les 5 parelles en el rang [2,10240] ha trigat aproximadament 0.37 seg en el mateix processador, i.e., una acceleració de 1000X). Us demanem desenvolupar les dues aproximacions: • • Aproximació força bruta. Per trobar les parelles de números amics, per cada parella de números considerada es fan els càlculs de les sumes alíquotes corresponents. Per trobar el números perfectes, per cada número es fa el càlcul de la seva suma alíquota. Aproximació una mica més intel·ligent. Es pre-calculen les sumes alíquotes de tots el números en el rang i després es busquen les parelles de números amics i els números perfectes. El programa haurà de tenir la següent funcionalitat: a. Revisarà que els arguments són presents i consistents. b. Crearà les estructures dinàmiques necessàries per resoldre el problema, comprovant que no es produeixen errors. c. Buscarà les parelles de números amics i els números perfectes amb l’aproximació intel·ligent. d. Si el número d’elements del rang és menor de 15000, farà el càlcul també fent servir l’aproximació per força bruta. e. Alliberarà la memòria reservada prèviament per les estructures dinàmiques. • Lliurament Pel lliurament d’aquesta pràctica s’habilitarà un lliurament al CV que permetrà pujar dos arxius per cada grup de pràctiques. El primer arxiu serà un informe de dos o tres pàgines en el que incloureu: 1. 2. 3. 4. 5. Noms i NIUS dels integrants del grup Breu resum del plantejament del problema Anàlisi del problema Disseny de la solució Resultat (s’han assolit els objectius?, proves realitzades, errors coneguts, etc.) 6. Principals problemes (què us ha costat més?) El segon arxiu serà el codi font (en un arxiu de text, és a dir, que pugui ser compilat i provat) comentat de forma apropiada (comentaris aclaridors d’aquells punts més complexes i comentaris generals per a totes les funcions). Altres detalls del lliurament es proporcionaran en la descripció de la tasca al CV.