Advertisement
apexsquirt

[PHP-CLI] Calcul de racines de polynômes

Oct 2nd, 2019
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.51 KB | None | 0 0
  1. <?php
  2.  
  3. // bon ok ça marche pas si :
  4. // - la dérivée ne s'annule jamais
  5. // - d'autres cas où le programme se softlock
  6. // - il peut y avoir plus de racines que ce que dit le programme
  7.  
  8. function show($a=[]) {
  9.     print "[";
  10.     for ($i = 0; $i < count($a)-1; $i++) {
  11.         print $a[$i].",\n ";
  12.     }
  13.     print $a[count($a)-1]."]";
  14. }
  15. function d($a=[]) {
  16.     $b = [];
  17.     for ($i = 0; $i < count($a)-1; $i++) {
  18.         $b[count($b)] = $a[$i]*(count($a)-$i-1);
  19.     }
  20.     return $b;
  21. }
  22. function P($a=[],$x) {
  23.     $s = 0;
  24.     for ($i = 0; $i < count($a); $i++) {
  25.         $s += $a[$i]*pow($x,count($a)-$i-1);
  26.     }
  27.     return $s;
  28. }
  29. function firstroot($a=[]) {
  30.     $n = count($a) - 1;
  31.     if ($a == []) {
  32.         return "mais";
  33.     } elseif ($n == 0) {
  34.         if ($a[0] == 0) { return NAN; }
  35.         else { return INF; }
  36.     } elseif ($n == 1) {
  37.         return -$a[1]/(2*$a[0]);
  38.     } elseif ($n == 2) {
  39.         return (-$a[1]-sqrt($a[1]**2 - 4*$a[0]*$a[1]))/(2*$a[0]);
  40.     } else {
  41.        
  42.         $yolo = firstroot(d($a));
  43.         $el_famoso = P($a,firstroot(d($a)));
  44.        
  45.         if ( $el_famoso == 0 ) { return $yolo; }
  46.        
  47.         if ($n % 2 == 1) {
  48.            
  49.             if ($a[0] > 0) {
  50.                 if ($el_famoso > 0) {
  51.                     while (P($a,$yolo) > 0) {
  52.                         $yolo--;
  53.                     }
  54.                     $yolo--;
  55.                     while (P($a,$yolo) < 0) {
  56.                         $yolo += 1/10;
  57.                     }
  58.                     return $yolo;
  59.                 } else {
  60.                     while (P($a,$yolo) < 0) {
  61.                         $yolo++;
  62.                     }
  63.                     $yolo++;
  64.                     while (P($a,$yolo) > 0) {
  65.                         $yolo -= 1/10;
  66.                     }
  67.                     return $yolo;
  68.                 }
  69.             } else {
  70.                 if ($el_famoso > 0) {
  71.                     while (P($a,$yolo) > 0) {
  72.                         $yolo++;
  73.                     }
  74.                     $yolo++;
  75.                     while (P($a,$yolo) < 0) {
  76.                         $yolo -= 1/10;
  77.                     }
  78.                     return $yolo;
  79.                 } else {
  80.                     while (P($a,$yolo) < 0) {
  81.                         $yolo--;
  82.                     }
  83.                     $yolo--;
  84.                     while (P($a,$yolo) > 0) {
  85.                         $yolo += 1/10;
  86.                     }
  87.                     return $yolo;
  88.                 }
  89.             }
  90.            
  91.         } elseif ($n % 2 == 0) {
  92.            
  93.             if ($a[0] > 0) {
  94.                 if ($el_famoso > 0) {
  95.                     while (P($a,$yolo) > 0) {
  96.                         if ($yolo > lastroot(d($a))) {
  97.                             return NAN;
  98.                         }
  99.                         $yolo++;
  100.                     }
  101.                     return $yolo;
  102.                 } else {
  103.                     while (P($a,$yolo) < 0) {
  104.                         $yolo--;
  105.                     }
  106.                     return $yolo;
  107.                 }
  108.             } else {
  109.                 if ($el_famoso < 0) {
  110.                     while (P($a,$yolo) < 0) {
  111.                         if ($yolo > lastroot(d($a))) {
  112.                             return NAN;
  113.                         }
  114.                         $yolo++;
  115.                     }
  116.                     return $yolo;
  117.                 } else {
  118.                     while (P($a,$yolo) > 0) {
  119.                         $yolo--;
  120.                     }
  121.                     return $yolo;
  122.                 }
  123.             }
  124.            
  125.         }
  126.     }
  127. }
  128. function lastroot($a=[]) {
  129.     $n = count($a) - 1;
  130.     if ($a == []) {
  131.         return "mais";
  132.     } elseif ($n == 0) {
  133.         if ($a[0] == 0) { return NAN; }
  134.         else { return INF; }
  135.     } elseif ($n == 1) {
  136.         return -$a[1]/(2*$a[0]);
  137.     } elseif ($n == 2) {
  138.         return (-$a[1]+sqrt($a[1]**2 - 4*$a[0]*$a[1]))/(2*$a[0]);
  139.     } else {
  140.        
  141.         $yolo = lastroot(d($a));
  142.         $el_famoso = P($a,lastroot(d($a)));
  143.        
  144.         if ( $el_famoso == 0 ) { return $yolo; }
  145.        
  146.         if ($n % 2 == 1) {
  147.            
  148.             if ($a[0] > 0) {
  149.                 if ($el_famoso > 0) {
  150.                     while (P($a,$yolo) > 0) {
  151.                         $yolo--;
  152.                     }
  153.                     $yolo--;
  154.                     while (P($a,$yolo) < 0) {
  155.                         $yolo += 1/10;
  156.                     }
  157.                     return $yolo;
  158.                 } else {
  159.                     while (P($a,$yolo) < 0) {
  160.                         $yolo++;
  161.                     }
  162.                     $yolo++;
  163.                     while (P($a,$yolo) > 0) {
  164.                         $yolo -= 1/10;
  165.                     }
  166.                     return $yolo;
  167.                 }
  168.             } else {
  169.                 if ($el_famoso > 0) {
  170.                     while (P($a,$yolo) > 0) {
  171.                         $yolo++;
  172.                     }
  173.                     $yolo++;
  174.                     while (P($a,$yolo) < 0) {
  175.                         $yolo -= 1/10;
  176.                     }
  177.                     return $yolo;
  178.                 } else {
  179.                     while (P($a,$yolo) < 0) {
  180.                         $yolo--;
  181.                     }
  182.                     $yolo--;
  183.                     while (P($a,$yolo) > 0) {
  184.                         $yolo += 1/10;
  185.                     }
  186.                     return $yolo;
  187.                 }
  188.             }
  189.            
  190.         } elseif ($n % 2 == 0) {
  191.            
  192.             if ($a[0] > 0) {
  193.                 if ($el_famoso > 0) {
  194.                     while (P($a,$yolo) > 0) {
  195.                         if ($yolo > firstroot(d($a))) {
  196.                             return NAN;
  197.                         }
  198.                         $yolo--;
  199.                     }
  200.                     return $yolo;
  201.                 } else {
  202.                     while (P($a,$yolo) < 0) {
  203.                         $yolo++;
  204.                     }
  205.                     return $yolo;
  206.                 }
  207.             } else {
  208.                 if ($el_famoso < 0) {
  209.                     while (P($a,$yolo) < 0) {
  210.                         $yolo--;
  211.                     }
  212.                     return $yolo;
  213.                 } else {
  214.                     while (P($a,$yolo) > 0) {
  215.                         if ($yolo < firstroot(d($a))) {
  216.                             return NAN;
  217.                         }
  218.                         $yolo++;
  219.                     }
  220.                     return $yolo;
  221.                 }
  222.             }
  223.            
  224.         }
  225.     }
  226. }
  227. function sgn($x) {
  228.     if ($x == 0) { return 0; } else { return $x/abs($x); }
  229. }
  230. function roots($a=[],$prec=1,$bruh1,$bruh2) {
  231.     if (firstroot($a) != NAN) {
  232.         $b = [];
  233.         for ($i = $bruh1; $i <= $bruh2; $i += $prec) {
  234.             if (sgn(P($a,$i)) != sgn(P($a,$i-$prec)) ) { $b[count($b)] = "[".($i-$prec).",$i]"; }
  235.         }
  236.         return show($b);
  237.     }
  238. }
  239. loop:
  240. $rls = readline("Coeffs (séparés par des virgules) : ");
  241. $prc = readline("Précision                         : ");
  242. $time1 = microtime(true);
  243. eval("\$set = [".$rls."];");
  244. $first = (firstroot($set)-2); $last = (lastroot($set)+2);
  245. print "Polynôme déduit : ";
  246.     if ($set[0] == 1) { print "x^".(count($set)-1); }
  247.     elseif ($set[0] == -1) { print "-x^".(count($set)-1); }
  248.     elseif ($set[0] > 0) { print $set[0]."x^".(count($set)-1); }
  249.     elseif ($set[0] < 0) { print "-".(-$set[0])."x^".(count($set)-1); }
  250. for ($i = 1; $i < count($set); $i++) {
  251.     if ($set[$i] == 1) { print "+x^".(count($set)-$i-1); }
  252.     elseif ($set[$i] == -1) { print "-x^".(count($set)-$i-1); }
  253.     elseif ($set[$i] > 0) { print "+".$set[$i]."x^".(count($set)-$i-1); }
  254.     elseif ($set[$i] < 0) { print "-".(-$set[$i])."x^".(count($set)-$i-1); }
  255. }
  256. print "\n";
  257. print "Racines : entre [".$first.",".$last."]\n";
  258. roots($set,$prc,$first,$last);
  259. print "\n";
  260. print "(Temps d'exécution : ".(microtime(true)-$time1).")\n";
  261. goto loop;
  262. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement