/** * Rend un polynome de degré 1 joli * @param Polynome $P Le polynome * @return string La représentation du polynome */ function prettyPolynome($P) { $len = count($P->monomes); if ($len == 2 && $P->calculDegrePolynome() == 1) { $m0 = $P->monomes[0]; $m1 = $P->monomes[1]; if ($m0->coeff < 0 && $m1->coeff < 0) { $r0 = new Monome(-1 * $m0->coeff, $m0->degre); $r1 = new Monome(-1 * $m1->coeff, $m1->degre); return "- (" . $r0 . " + " . $r1 . ")"; } if ($m0->coeff < 0 && $m1->coeff > 0) { return "(" . $m1 . " " . $m0 . ")"; } return "(" . $P . ")"; } elseif ($len == 1 && $P->calculDegrePolynome() == 1) { return $P; } else { throw new Exception("WTF ?", 1); } }
/** * 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; }