Esercizio 9
Scrivi un programma che applicando la regola di Ruffini, sia in grado di individuare le radici intere di un polinomio di grado n ordinato per potenze decrescenti della variabile x.
La regola di Ruffini viene usata nella pratica, per dividere
un polinomio di grado n ordinato per potenze decrescenti della variabile
x.
La sua applicazione spesso laboriosa per vari motivi ( perch non ci si
ricorda lo schema, perch bisogna procedere per tentativi) .
Il metodo collegato al problema della divisione di un polinomio di grado
n per un binomio di primo grado.
Supponiamo di voler eseguire la divisione fra un polinomio A(x) di grado
3 ed un binomio di primo grado B(x) :
Si disegna lo schema seguente:
poi si eseguono i seguenti movimenti
Il risultato finale sar
viene ottenuto un polinomio quoziente di grado n-1
con un resto R=+16.
Particolarmente interessante la soluzione con resto zero; questo significa che A(x) divisibile per B(x) e si potr scrivere:
Poi se Q(x) un trinomio di secondo grado, si può
tentare di decomporlo con la formula del trinomio, altrimenti si cerca di
decomporlo ancora con la regola di Ruffini.
Ad esempio la divisione
si
svolge nel seguente modo

Il risultato finale sar
si pu quindi scrivere :
in questo modo si pu decomporre un polinomio di ordine
n nel prodotto di tanti binomi.
Il problema sempre quello di individuare il termine noto del binomio.
Se il polinomio divisibile il termine noto del binomio sempre un divisore
del termine noto del polinomio. Nel caso precedente i divisori (interi)
di -6 sono: +1,-1,+2,-2,+3,-3,+6,-6; quindi per sapere se un polinomio ha
un binomio divisore bisogna eseguire la regola di Ruffini con tutti questi
tentativi.
L'algoritmo implica la soluzione di un problema molto 'gettonato' in informatica,
cio , l'individuazione di tutti i divisori (interi) di un numero intero,
qui risolti dal passaggio
(ma
si pu fare di meglio) :
for(i=2;i <=Math.abs(n/2);i++)
if(n%i==0)divisori++;
Il nostro obiettivo automatizzare queste operazioni, d'altra parte se
possibile eseguirle manualmente sar certamente possibile farle eseguire
all'elaboratore. Non vogliamo discostarci da questo schema, pertanto chiederemo
in input il grado g del polinomio, allocheremo in
memoria un vettore P di dimensione g+1 P[g+1] verranno
contati ed ottenuti i divisore del termine noto di P(x).
Questi k divisori saranno memorizzati in un vettore T di dimensione opportuna,
dopodich il programma eseguir tutti i tentativi possibili (con i divisori
interi) ottenendo i coefficienti del polinomio quoziente Q(x) che verranno
memorizzati nel vettore Q di dimensione g Q[g].
Alla prima occorrenza in cui viene trovata una radice il programma si ferma
restituisce in output il valore della radice e viene stampato il vettore
dei coefficienti del polinomio ridotto Q(x).
Questo breve scritto è stato pensato per elaborare polinomi con coefficienti
interi, ricercando radici intere, ma può essere ulteriormente ampliato
per considerare polinomi a coefficienti razionali e/o per cercare radici
razionali; ma in quest'ultimo caso, i possibili divisori del termine noto
sarebbero infiniti e qundi occorrerebbe scrivere una procedura di ricerca
esaustiva (bruteforce).
import java.util.Scanner;
class ruffini{ public static void main (String args []) {
Scanner in=new Scanner(System.in);
int g,i,n,m,j;
int radice=0,divisori=0;
do{
System.out.print("inserire il grado del polinomio:
");
g=in.nextInt();
}while(g < 3 || g > 9);
int P[]=new int[g+1];
int Q[]=new int[g]; //acquis. dei coefficienti del
polinomio P(x)
for(i=0;i <=g;i++){
System.out.print("ins.coeff.grado "+(g-i)+":");
P[i]=in.nextInt();
}
for(i=0;i < P.length;i++)System.out.print(P[i]+" ");
System.out.println("\n");
n=P[P.length-1]; //conta i divisori del termine
noto
for(i=2;i <=Math.abs(n/2);i++)
if(n%i==0)divisori++;
int T[]=new int[2*(divisori+2)];//istanzia
il vettore T dei divisori
T[0]=1;//il 1 elem. 1
T[1]=-1;//il 2 elem. -1
T[T.length-2]=n;//il penultimo elem. n coefficiente
di grado 0
T[T.length-1]=-n;//l'ultimo elem. -n
j=2;//memorizza i restanti divisori nel vettore
T
//calcola il vettore dei
coefficienti del quoziente Q(x)
for(i=2;i <=Math.abs(n/2);i++)
if(n%i==0){T[j]=i;T[j+1]=-i;j+=2;};
for(j=0;j < T.length;j++){
n=T[j];
m=Q[0]=P[0];
for(i=1;i < P.length;i++){
m=n*m+P[i];
if(i < P.length-1)Q[i]=m;
}
if(m==0){radice=T[j];break;}
}//fine for j
if(radice!=0){
System.out.println("ha una radice:"+radice+"\n");
System.out.println("i coefficienti del polinomio di grado "+
(g-1)+" sono:");
for(i=0;i < Q.length;i++)System.out.print(Q[i]+" ");
}else System.out.println("nessuna radice trovata");
}//fine main
}//fine classe
Lo stesso codice potr poi essere facilmente tradotto in altri linguaggi.