Listing du fichier ds4c_inc.php
00001 <?php
00002
00003 ######################################################################################
00004
00005 function ds4c($nombre) { # décomposition en somme de 4 carrés
00006
00007 ######################################################################################
00008
00009 $dbg = 0 ; # 0 en standard, 1 pour debug
00010
00011 # valeur limite : la racine carrée du nombre
00012
00013 $racine = round(sqrt($nombre)) ;
00014
00015 $n1 = $racine ;
00016
00017 # on boucle sur n1, n2 et n3 seulement,
00018 # n4 s'en déduira
00019 # comme il peut y avoir plusieurs solutions,
00020 # on renvoie ce qu'on a trouvé le plus tot possible
00021
00022 while ($n1>=0) {
00023 $cn1 = $n1*$n1 ;
00024 $n2 = $racine ;
00025 while ($n2>=0) {
00026 $cn2 = $n2*$n2 ;
00027 $n3 = $racine ;
00028 while ($n3>=0) {
00029 $cn3 = $n3*$n3 ;
00030 $cn4 = $nombre - ($cn1+$cn2+$cn3) ;
00031 if ($dbg==1) {
00032 echo " n1 $n1 n2 $n2 n3 $n3 cn4 $cn4 \n" ;
00033 } # fin si
00034 if ($cn4>=0) {
00035 $n4 = sqrt($cn4) ;
00036 if ($dbg==1) {
00037 echo " n4 possible $n4 \n" ;
00038 } # fin si
00039 if (round($n4)==$n4) {
00040 return( array($n1,$n2,$n3,$n4) ) ;
00041 } ; # fin si
00042 } ; # fin si
00043 $n3-- ;
00044 } # fin tant que sur n3
00045 $n2-- ;
00046 } # fin tant que sur n2
00047 $n1-- ;
00048 } # fin tant que sur n1
00049
00050 return( array("?","?","?","?") ) ;
00051
00052 } # fin fonction ds4c
00053
00054 ######################################################################################
00055
00056 function ads4c($nombre) { # arbre de décomposition en somme de 4 carrés
00057
00058 ######################################################################################
00059
00060 $dbg = 0 ; # 0 en standard, 1 pour debug ou affichage détaillé en cours
00061
00062 $decomp = array() ;
00063 $noeuds = array() ;
00064 $labels = array() ;
00065 $arcs = array() ;
00066
00067 $nbe = 1 ;
00068 $noeud = "n".$nombre."_".$nbe ;
00069 $noeuds[$nbe] = $noeud ;
00070 $labels[$nbe] = $nombre ;
00071 array_push($decomp,$noeud) ;
00072
00073 $txt = " digraph decomp { \n\n";
00074
00075 if ($dbg==1) { pre("cadre") ;
00076
00077 print(" $nombre : ") ;
00078 print_r(ds4c($nombre)) ;
00079
00080 } ; # fin si
00081
00082 while ((count($decomp)>0) and ($nbe<100)) {
00083
00084 $noeud = array_pop($decomp) ;
00085 if ($dbg==1) { echo " noeud $noeud : " ; } ;
00086 $n = substr($noeud,1,strpos($noeud,"_")-1) ;
00087 $decc = ds4c($n) ;
00088 if ($dbg==1) { echo " n ==> $n \n" ; } ;
00089
00090 list($a,$b,$c,$d) = $decc ;
00091
00092 $nbe++ ;
00093 $nnoeud = "n".$a."_".$nbe ;
00094 $noeuds[$nbe] = $nnoeud ;
00095 $labels[$nbe] = $a ;
00096 $arcs[$nbe] = " $noeud -> $nnoeud ; " ;
00097 if ($a>1) {
00098 array_push($decomp,$nnoeud) ;
00099 } # fin si
00100
00101 $nbe++ ;
00102 $nnoeud = "n".$b."_".$nbe ;
00103 $noeuds[$nbe] = $nnoeud ;
00104 $labels[$nbe] = $b ;
00105 $arcs[$nbe] = " $noeud -> $nnoeud ; " ;
00106 if ($b>1) {
00107 array_push($decomp,$nnoeud) ;
00108 } # fin si
00109
00110 $nbe++ ;
00111 $nnoeud = "n".$c."_".$nbe ;
00112 $noeuds[$nbe] = $nnoeud ;
00113 $labels[$nbe] = $c ;
00114 $arcs[$nbe] = " $noeud -> $nnoeud ; " ;
00115 if ($c>1) {
00116 array_push($decomp,$nnoeud) ;
00117 } # fin si
00118
00119 $nbe++ ;
00120 $nnoeud = "n".$d."_".$nbe ;
00121 $noeuds[$nbe] = $nnoeud ;
00122 $labels[$nbe] = $d ;
00123 $arcs[$nbe] = " $noeud -> $nnoeud ; " ;
00124 if ($d>1) {
00125 array_push($decomp,$nnoeud) ;
00126 } # fin si
00127 } # fin tant que
00128
00129
00130 if ($dbg==1) {
00131
00132 echo " Noeuds " ;
00133 print_r($noeuds) ;
00134
00135 echo " Labels " ;
00136 print_r($labels) ;
00137
00138 echo " Arcs " ;
00139 print_r($arcs) ;
00140
00141 echo " texte de l'arbre : \n\n" ;
00142
00143 } ; # fin si
00144
00145 for ($ide=1;$ide<=$nbe;$ide++) {
00146 $txt .= " ".$noeuds[$ide].' [label="'.$labels[$ide].'"] '."\n" ;
00147 } # fin pour ide
00148
00149 $txt .= "\n" ;
00150
00151 for ($ide=2;$ide<=$nbe;$ide++) {
00152 $txt .= " ".$arcs[$ide]."\n" ;
00153 } # fin pour ide
00154
00155 $txt .= "\n }\n\n" ;
00156
00157 if ($dbg==1) { echo $txt ; } ;
00158
00159 if ($dbg==1) { finpre() ; } ;
00160
00161 $ftmp = tempnam("../wtmp","ads4c") ;
00162 $ftmp1 = $ftmp.".dot" ;
00163 $ftmp2 = $ftmp.".png" ;
00164 file_put_contents($ftmp1,$txt) ;
00165
00166 $cmd1 = " dot -T png $ftmp1 -o $ftmp2 " ;
00167 system($cmd1) ;
00168 $cmd2 = " chmod 644 $ftmp2" ;
00169 system($cmd2) ;
00170
00171 if ($dbg==1) {
00172 pre_fichier($ftmp,"cadre") ;
00173
00174 p() ;
00175 echo b("Exécution de ").$cmd1 ;
00176 finp() ;
00177
00178 } # fin si
00179
00180 p() ;
00181 $img = "../".substr($ftmp2,strpos($ftmp2,"wtmp")) ;
00182 echo href($img,img($img,"",800)) ;
00183 finp() ;
00184
00185 } # fin fonction ads4c
00186
00187 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)