Ecco un programma che trova gli zeri di un polinomio

G. Severini - 1908 - "Venditore di Cialde in Avenue Trudaine"

Il programma che segue applica il teorema di Ruffini.

Si evidenziano le seguenti cose:

– la prima parte chiede soltanto i coefficienti del polinomio da quellocon grado più elevato fino al termine noto–> salva i dati in una lista di nome polinomio

– la seconda parte determina i divisori del termine noto salvandoli in una lista di nome divisori.

– la terza parte verifica quali tra i divisori sono gli zeri del polinomio

Quest’ultima parte è la più complessa in quanto vi sono due cicli for uno dentro all’altro.

Per capirlo nei dettagli bisogna togliere il cancelletto nella parte commentata per seguire nei passi il ragionamento.

E’ la parte più complicata oggettivamente per programmatori esperti.

Le soluzioni trovate le salvo ancora in una lista e controllo il numero di elementi per emettere il messaggio corretto.

Notare quanto sia importante la fase dichiarativo

Ma ecco il programma:

################################
# Teorema di ruffini
# autore Francesco Bragadin
################################
#Area dichiarativa
polinomio=[]
divisori=[]
soluzioni=[]
sommafinale=0
divisore=1

###########################
#parte prima
#inserimento coefficienti
###########################

print “Programma teorema di Ruffini”
entrata = raw_input(“Inserisci un coefficiente? [y/n]”)
while entrata==”y”:
p=input(“coefficiente: “)
polinomio.append(p)
entrata= raw_input(“Inserisci un coefficiente? [y/n]”)

print “ecco il mio polinomio”
print polinomio

#######################################
#parte seconda
# scoperta divisori del termine noto
#######################################

#lunghezza polinomio
# o meglio quanti elementi contiene?
elementipolinomio = len(polinomio)

#il termine noto è l’ultimo elemento della lista
# il primo elemento è quello con indice zero mentre
# l’ultimo è quello identificato da ep-1

terminenoto = polinomio[elementipolinomio-1]
print “Il termine noto è: “,terminenoto
if terminenoto<0:
terminenoto=-terminenoto

#continuo il ciclo finchè il divisore non è uguale ad termine noto
while divisore<=terminenoto:
resto=terminenoto%divisore
if resto==0:
divisori.append(divisore)
#se è un divisore devo prendere anche il suo opposto
divisori.append(-divisore)
# incremento il divisore sempre di uno
divisore=divisore+1

print “Ecco i divisori!”
print divisori

############################################
# parte terza
#  quali sono gli zeri del polinomio?
############################################

#quanti sono i divisori?
numerodivisori=len(divisori)

for i in range(numerodivisori):
for j in range(elementipolinomio):
###############################################################################
# serve per controllare il ciclo
#        print polinomio[j],” “,divisori[i],” “,(elementipolinomio-1-j)
###############################################################################
sommaparziale=polinomio[j]*(divisori[i]**(elementipolinomio-1-j))
sommafinale=sommafinale+sommaparziale
###############################################################################
# serve per controllare il ciclo
#        print sommafinale
###############################################################################
if sommafinale==0:
# metto gli zeri in una lista
soluzioni.append(divisori[i])

# devo ripartire dal primo elemento del polinomio
# devo rimettere a zeo la sommafinale
j=0
sommafinale=0

numerosoluzioni=len(soluzioni)
if numerosoluzioni==0:
print “Non ci sono soluzioni”
if numerosoluzioni==1:
print “la soluzione è: “,soluzioni[0]
if numerosoluzioni >1:
print “le soluzioni sono:”
print soluzioni

About Francesco Bragadin

Insegno informatica e telecomunicazioni al liceo scienze applicate ed all'indirizzo informatica e telecomunicazioni. Ho terminato gli studi in ingegneria elettronica e telecomunicazioni lavorando per molti anni come libero professionista nell'ambito della gestione storage e disaster recovery su mainframe.
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *