edutecnica

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.

grado :