Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- // bon ok ça marche pas si :
- // - la dérivée ne s'annule jamais
- // - d'autres cas où le programme se softlock
- // - il peut y avoir plus de racines que ce que dit le programme
- function show($a=[]) {
- print "[";
- for ($i = 0; $i < count($a)-1; $i++) {
- print $a[$i].",\n ";
- }
- print $a[count($a)-1]."]";
- }
- function d($a=[]) {
- $b = [];
- for ($i = 0; $i < count($a)-1; $i++) {
- $b[count($b)] = $a[$i]*(count($a)-$i-1);
- }
- return $b;
- }
- function P($a=[],$x) {
- $s = 0;
- for ($i = 0; $i < count($a); $i++) {
- $s += $a[$i]*pow($x,count($a)-$i-1);
- }
- return $s;
- }
- function firstroot($a=[]) {
- $n = count($a) - 1;
- if ($a == []) {
- return "mais";
- } elseif ($n == 0) {
- if ($a[0] == 0) { return NAN; }
- else { return INF; }
- } elseif ($n == 1) {
- return -$a[1]/(2*$a[0]);
- } elseif ($n == 2) {
- return (-$a[1]-sqrt($a[1]**2 - 4*$a[0]*$a[1]))/(2*$a[0]);
- } else {
- $yolo = firstroot(d($a));
- $el_famoso = P($a,firstroot(d($a)));
- if ( $el_famoso == 0 ) { return $yolo; }
- if ($n % 2 == 1) {
- if ($a[0] > 0) {
- if ($el_famoso > 0) {
- while (P($a,$yolo) > 0) {
- $yolo--;
- }
- $yolo--;
- while (P($a,$yolo) < 0) {
- $yolo += 1/10;
- }
- return $yolo;
- } else {
- while (P($a,$yolo) < 0) {
- $yolo++;
- }
- $yolo++;
- while (P($a,$yolo) > 0) {
- $yolo -= 1/10;
- }
- return $yolo;
- }
- } else {
- if ($el_famoso > 0) {
- while (P($a,$yolo) > 0) {
- $yolo++;
- }
- $yolo++;
- while (P($a,$yolo) < 0) {
- $yolo -= 1/10;
- }
- return $yolo;
- } else {
- while (P($a,$yolo) < 0) {
- $yolo--;
- }
- $yolo--;
- while (P($a,$yolo) > 0) {
- $yolo += 1/10;
- }
- return $yolo;
- }
- }
- } elseif ($n % 2 == 0) {
- if ($a[0] > 0) {
- if ($el_famoso > 0) {
- while (P($a,$yolo) > 0) {
- if ($yolo > lastroot(d($a))) {
- return NAN;
- }
- $yolo++;
- }
- return $yolo;
- } else {
- while (P($a,$yolo) < 0) {
- $yolo--;
- }
- return $yolo;
- }
- } else {
- if ($el_famoso < 0) {
- while (P($a,$yolo) < 0) {
- if ($yolo > lastroot(d($a))) {
- return NAN;
- }
- $yolo++;
- }
- return $yolo;
- } else {
- while (P($a,$yolo) > 0) {
- $yolo--;
- }
- return $yolo;
- }
- }
- }
- }
- }
- function lastroot($a=[]) {
- $n = count($a) - 1;
- if ($a == []) {
- return "mais";
- } elseif ($n == 0) {
- if ($a[0] == 0) { return NAN; }
- else { return INF; }
- } elseif ($n == 1) {
- return -$a[1]/(2*$a[0]);
- } elseif ($n == 2) {
- return (-$a[1]+sqrt($a[1]**2 - 4*$a[0]*$a[1]))/(2*$a[0]);
- } else {
- $yolo = lastroot(d($a));
- $el_famoso = P($a,lastroot(d($a)));
- if ( $el_famoso == 0 ) { return $yolo; }
- if ($n % 2 == 1) {
- if ($a[0] > 0) {
- if ($el_famoso > 0) {
- while (P($a,$yolo) > 0) {
- $yolo--;
- }
- $yolo--;
- while (P($a,$yolo) < 0) {
- $yolo += 1/10;
- }
- return $yolo;
- } else {
- while (P($a,$yolo) < 0) {
- $yolo++;
- }
- $yolo++;
- while (P($a,$yolo) > 0) {
- $yolo -= 1/10;
- }
- return $yolo;
- }
- } else {
- if ($el_famoso > 0) {
- while (P($a,$yolo) > 0) {
- $yolo++;
- }
- $yolo++;
- while (P($a,$yolo) < 0) {
- $yolo -= 1/10;
- }
- return $yolo;
- } else {
- while (P($a,$yolo) < 0) {
- $yolo--;
- }
- $yolo--;
- while (P($a,$yolo) > 0) {
- $yolo += 1/10;
- }
- return $yolo;
- }
- }
- } elseif ($n % 2 == 0) {
- if ($a[0] > 0) {
- if ($el_famoso > 0) {
- while (P($a,$yolo) > 0) {
- if ($yolo > firstroot(d($a))) {
- return NAN;
- }
- $yolo--;
- }
- return $yolo;
- } else {
- while (P($a,$yolo) < 0) {
- $yolo++;
- }
- return $yolo;
- }
- } else {
- if ($el_famoso < 0) {
- while (P($a,$yolo) < 0) {
- $yolo--;
- }
- return $yolo;
- } else {
- while (P($a,$yolo) > 0) {
- if ($yolo < firstroot(d($a))) {
- return NAN;
- }
- $yolo++;
- }
- return $yolo;
- }
- }
- }
- }
- }
- function sgn($x) {
- if ($x == 0) { return 0; } else { return $x/abs($x); }
- }
- function roots($a=[],$prec=1,$bruh1,$bruh2) {
- if (firstroot($a) != NAN) {
- $b = [];
- for ($i = $bruh1; $i <= $bruh2; $i += $prec) {
- if (sgn(P($a,$i)) != sgn(P($a,$i-$prec)) ) { $b[count($b)] = "[".($i-$prec).",$i]"; }
- }
- return show($b);
- }
- }
- loop:
- $rls = readline("Coeffs (séparés par des virgules) : ");
- $prc = readline("Précision : ");
- $time1 = microtime(true);
- eval("\$set = [".$rls."];");
- $first = (firstroot($set)-2); $last = (lastroot($set)+2);
- print "Polynôme déduit : ";
- if ($set[0] == 1) { print "x^".(count($set)-1); }
- elseif ($set[0] == -1) { print "-x^".(count($set)-1); }
- elseif ($set[0] > 0) { print $set[0]."x^".(count($set)-1); }
- elseif ($set[0] < 0) { print "-".(-$set[0])."x^".(count($set)-1); }
- for ($i = 1; $i < count($set); $i++) {
- if ($set[$i] == 1) { print "+x^".(count($set)-$i-1); }
- elseif ($set[$i] == -1) { print "-x^".(count($set)-$i-1); }
- elseif ($set[$i] > 0) { print "+".$set[$i]."x^".(count($set)-$i-1); }
- elseif ($set[$i] < 0) { print "-".(-$set[$i])."x^".(count($set)-$i-1); }
- }
- print "\n";
- print "Racines : entre [".$first.",".$last."]\n";
- roots($set,$prc,$first,$last);
- print "\n";
- print "(Temps d'exécution : ".(microtime(true)-$time1).")\n";
- goto loop;
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement