/** * Rend la factorisation plus compacte et peut-être jolie * @param Polynome $P1 Le facteur 1 * @param Polynome $P2 Le facteur 2 * @param Polynome $P3 Le facteur 3 * @return string La représentation factorisée du polynome */ function prettyFactors($P1, $P2, $P3) { // echo $P1."<br/>".$P2."<br/>".$P3."<br/>"; if ($P1->equals($P2) && $P1->equals($P3)) { return prettyPolynome($P1) . "³"; } elseif ($P1->equals($P2) && $P2->equals($P3->multNumber(-1))) { return "- " . prettyPolynome($P1) . "³"; } elseif ($P1->equals($P2->multNumber(-1)) && $P1->equals($P3)) { return "- " . prettyPolynome($P1) . "³"; } elseif ($P1->equals($P2->multNumber(-1)) && $P2->equals($P3)) { return prettyPolynome($P1) . "³"; } elseif ($P1->equals($P2) && !$P1->equals($P3)) { return prettyPolynome($P1) . "²" . prettyPolynome($P3); } elseif (!$P1->equals($P2) && $P1->equals($P3)) { return prettyPolynome($P1) . "²" . prettyPolynome($P2); } elseif ($P1->equals($P2->multNumber(-1)) && !$P1->equals($P3) && !$P2->equals($P3)) { return "- " . prettyPolynome($P1) . "²" . prettyPolynome($P3); } elseif ($P2->equals($P3->multNumber(-1)) && !$P1->equals($P3) && !$P1->equals($P2)) { return "- " . prettyPolynome($P3) . "²" . prettyPolynome($P1); } return prettyPolynome($P1) . prettyPolynome($P2) . prettyPolynome($P3); }
/** * 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; }