Bonjour / Bonsoir,
j'ai une question peu commune à vous soumettre : comment placer des des objets HTML, par exemple des balises génériques <div></div> en spirale.
Je ne sais pas s'il y a des gens assez passionnés par les mathématiques dans ce forum, mais peu importe.
J'ai plusieurs fonctions sur les nombres premiers dans un fichier. En bref, elles me permettent de déterminer quels sont les nombres premiers entre 0 et 1000000.
Je souhaiterais les afficher par le biais d'une spirale d'Ulam ( voir ici).
(Vous pouvez d'ailleurs voir qu'une des images a été générée par GD en PHP mais je souhaiterais procéder autrement question de 'lourdeur')
J'utilise le langage PHP couplé au HTML 5 (de préférence mais je saurais adapter).
Auriez-vous une idée ?
Je précise que je souhaite que la grille contenant cette spirale puisse s'adapter en fonction de la longueur de l'intervalle étudié.
Je pense sincèrement que c'est assez complexe.

Je vous remercie d'avance de toute l'aide que vous pourrez m'apporter,

Cordialement,

@ntonin.

5 réponses


BenFarhat
Réponse acceptée

Magnifique! merci a toi bien je t'explique le principe Pardon mais je parle avec la logique analyste et non mathématicien Ta spirale c'est un tableau qui contient des nombre qui vont de 1 à X pour le test j'ai fait en sortes que ce soit toujours un carré (1,4,9,16,25...) donc au debut ou je demande un nombre $nb et je prend son carré pour avoir le nombre maximum dans ce tableau ensuite j'ai remarque que dans ce carré tout part du centre donc le plus dure c'est de trouvé le centre (sa position dans le tableau) ensuite je fait un tableau position*[j]=valeur et quand je trouve le x et y du centre je dirait que position[x][y]=1 pour trouver ce x et y c'est simple $y=floor(($nb+1)/2+0.5); $x=floor(($nb+1)/2); Ensuite comme un jeu je rempli mon tableau avec toute les positions et les valeurs donc si tu regarde bien ta spirale tu constate qu'elle va a droite, puis en haut, puis à gauche, puis en bas, puis encore à droite ect etc... en boucle et à l'infini elle commence avec un "pas" (distance et non négation) de 1 ca veut dire qu'elle fait un pas à droite puis va en haut ensuite fait un autre "pas" et va en haut en regardant la spirale on constate qu'a chaque changement de direction de droite ou de droite le "pas" s'incrémente donc regarde bien mon pas est de zero je vais à droite donc j'eleve le pas (ou distance) à 1 je suis à la position 1 je vais à droite et je m'arrete car mon pas est de1 je monte et je m'arrete car mon pas est de deux la je vais en direction gauche mon pas passe de 1 à deux donc je vais deux fois à gauche puis je m'arrete ensuite je descend de deux cases puis je m'arrete même chose mon pas va à droite donc j'elève le pas de1 ca devient 3 etc etc ensuite c'est simple de $count=1 à $count=nb*nb je simule le deplacement dans le tableau en simulant la spirale je vais à droite, en haut, a gauche a droite en haut a gauche .... en suivant et modifiant le pas puis je change la valeur de x et y dans position[x][y] si je vais à droite le x s'incremente si je vais à gauche ca décrémente si je descend ou mont je change le y et la valeur que j'insère s'incrémente bref je sais pas si tu me suis mais le résultat chez moi est magnifique si le nombre est premier la case est bleu, le centre c'est rouge, les autres sont blanche il y a toujours le nombre écrit à l'intérieur (mais tu peux changer pour écrire que les premiers) et j'ai fait une taille de case du tableau et de police qui depend de la taille de la spirale donc vers les 3600 cases/élements ca marche, au dessus mais la police devient très petite, par contre avec la couleur tu vois bien le motif qui a ce que j'ai compris fait le mystère pour la fonction testpremier je l'utilise lors de l'affichage, si c'est true la case est bleu, sinon elle reste blanche voila :) Samedi soir spécial Geek... remarque... avec ce froid ca fait passer le temps alors voila le code, j'ai mis le css je sais pas ce que ca donnera (coté style) moi je test sur une interface de démo basé sur bootstrap [code]

<form method="GET">
<label for="nombre">Taille de la spirale</label><input id="nombre" name="nombre" if echo> class="span1"/>
</form><?php if(isset($_GET['nombre'])):

function testpremier($test){
$nbdiv=1;

        for($i=3; $i<=$test; $i++) 
        { 
            $reste=$test%$i; 
            if($reste==0) 
                $nbdiv++; 
        } 
        return (($nbdiv == 2)?true:false);
        } 

    // Notre nombre de calcul (désolé la spirale ne sera que carré mais on peut trés facilement change en x et y)
    $nb=$_GET['nombre'];
    //on cherche la position du 1 dans le tableau
    $y=floor(($nb+1)/2+0.5);
    $x=floor(($nb+1)/2);
    $position=array();

    $direction=3; // les direction sont 0-> d pour droite, 1->h pour haut, 2->g pour gauche et 3->b pour bas bref je suis la spirale $pas=0;// le pas change quand je change de direction entre d ou g $count=1; $position[$x][$y]=$count; while($count 
Spirale d'Ulam

La taille choisit est <?php echo $nb;?>, soit <?php echo $nb*$nb?> cases.

Le centre est à la position:<?php echo $x.":".$y;?>

<style>
table {
background-color: transparent;
border-collapse: collapse;
border-spacing: 0;
max-width: 100%;
}
.table {
margin-bottom: 20px;
width: 100%;
}
.table th, .table td {
border-top: 1px solid #CCCCCC;
line-height: 20px;
padding: 8px;
text-align: left;
vertical-align: top;
}
.table-bordered {
-moz-border-bottom-colors: none;
-moz-border-image: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
border-collapse: separate;
border-color: #CCCCCC #CCCCCC #CCCCCC -moz-use-text-color;
border-radius: 0 0 0 0;
border-style: solid solid solid none;
border-width: 1px 1px 1px 0;
}
table.spirale td{
width:<?php echo 99.99/$nb; ?>%;
font-size:<?php echo 400/$nb; ?>px;
height:<?php echo 500/$nb; ?>px;
padding:2px;
text-align:center;
vertical-align:middle;
}
table.spirale td.centre{
background-color:#bd362f;
color:#fff;
}
table.spirale td.prem{
background-color:#2f96b4;
color:#fff;
}

</style>

<?php for($i=0;$i<$nb;$i++){
echo "<tr>"; for($j=0;$j'; } else { if(testpremier($position[$j+1][$i+1])) echo ' '; else echo " | "; } echo $position[$j+1][$i+1]." |"; } echo ""; } ?>
<?php endif; ?>
[/code] Voila en cas de soucis je suis la :)

Ouuuuuula!!! j'adore (pas les maths) je m'y met tout de suite et des que je finis je t'envoi le résultat (approche et code) :)

@ntonin
Auteur

Merci beaucoup j'ai déjà fait quelques ébauches de formules mais je dois avouer que je n'ai qu'à peine progressé. =)

@ntonin
Auteur

Wow.
Merci beaucoup.
Je teste ça dès que j'aurai le temps (eh oui les devoirs me rattrapent...)

Edit : j'ai testé et ça marche très bien je vais l'adapter et l'optimiser et je t'enverrais tout ça si tu le souhaites, avec mes fonctions sur les nombres premiers.

Vraiment merci =)
Je t'envoie mon adresse-mail par MP pour te donner mes fonctions sur les nombres premiers si tu veux =).

Edit : je viens de voir qu'il n'y a pas de messages privés...
Je te donnerais mon adresse e-mail à un heure précise =)
18h pile ce soir te conviendrait ?

Je mets résolu le temps que je teste ;)

ca ira :) merci quand même :)