Valid XHTML     Valid CSS2    

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 gH    Retour à la page principale de   (gH)