/** * L'algorithme de division euclidienne de polynomes * Merci : http://www.developpez.net/forums/d174185/general-developpement/algorithme-mathematiques/mathematiques/division-euclidienne-polynome/#post1117295 * @param Polynome $P2 Le Polynome diviseur * @return Polynome Le Polynome dividende */ public function algorithme($P2) { // $P1 est une copie de $this $P1 = $this->clonePolynome(); // $P stockera le résultat $P = new Polynome(array(new Monome(0, 0))); // $degre1 est le degré maximum actuel du Polynome $P1 $degre1 = $P1->calculDegrePolynome(); // $degre2 est le degré maximum du Polynome $P2 $degre2 = $P2->calculDegrePolynome(); // $coeff2 est le coefficient du Monome de degré $degre2 de $P2 $coeff2 = $P2->getMonomeByDegre($degre2)->coeff; // Tant que le degré de $P2 est inférieur ou égal au degré de $P1 while ($degre1 >= $degre2) { // On actualise le degré de $P1 $degre1 = $P1->calculDegrePolynome(); // $n est la différence de degré entre $P1 et $P2 $n = $degre1 - $degre2; // $coeff1 est le coefficient du Monome de degré $degre1 de $P1 $coeff1 = $P1->getMonomeByDegre($degre1)->coeff; // $xn est le Monome valant X à la puissance $n $xn = new Monome(1, $n); // $coeffDiv est le dividende des coefficients actuels $coeffDiv = $coeff1 / $coeff2; // $P2xn est le Polynome avec lequel on multiplie $xn $P2xn = $P2->multMonome($xn); // $P2xndiv est le Polynome avec lequel on multiplie $coeffDiv $P2xndiv = $P2xn->multNumber($coeffDiv); // $P1 est le nouveau Polynome diviseur, il vaut la soustraction de $P1 avec $P2xndiv // comme dans la division euclidienne à l'école $P1 = $P1->subPolynome($P2xndiv); // $P recoit $P + $xn * $coeffDiv $P = $P->addMonome($xn->multNumber($coeffDiv)); } // $Q = $this->subPolynome($P2->multPolynome($P)); // $P1 = $this->subPolynome($P2->multPolynome($P)); return $P; }