Decomposition d'un nombre en puissances de facteurs premiers.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 831 fois - Téléchargée 23 fois

Contenu du snippet

1ere source ici, le code décompose un nombre en produits de facteurs premiers, par exemple en entrant 1256 , la page vous sortira 1256 = 2^3*157^1.
si vous entrez deux nombres, le script cherche le PGCD grace a l'algorithme d'euclide, puis l'affiche, ainsi que le PPCM.
Chaque facteur est ensuite stocké dans une valeur d'un array $prem, et donc facilement evolutif.
script en ligne sur http://tpepetrole0506.free.fr/navette/fact2.php

Source / Exemple :


<?php
$f1 = $_GET['a'];
$f2 = $_GET['b'];
function prems($num) 
{
if ( $num != "" ) {
$a = 2;
$h1 = $num;
echo "$num = ";
while ($num > 1) {
$b = $num / $a;
if (is_int($b)) {
$num = $b;
$fact = "$fact $a";
}
else {
$a++;
}
}
$o = 1;
$m = 1;
$d = 1;
$prem["$h1"] = explode(" ", $fact);
while($o < count($prem["$h1"])) {
if ($prem["$h1"][$o] == $prem["$h1"][$o + 1]) {
 $m = $m + 1;
}
if ($prem["$h1"]["$o"] != $prem["$h1"][$o + 1]) {
 if ($o + 1 == count($prem["$h1"])) {
 echo $prem["$h1"]["$o"] ."^". $m;
 $d = $d * ($m + 1);
 }
 else {
 echo $prem["$h1"]["$o"] ."^". $m ."*";
 $d = $d * ($m + 1);
 }
$m = 1;
}
$o++;
}
echo "<br>". $h1 ." admet exactement ". $d ." diviseurs<br>";
if ( $d == 2 ) {
echo $h1 . " est premier </br><br>";
}
}
}
prems($f1);
prems($f2);

function PGCD($a,$b) {
$r = fmod($a,$b);
$p = $b;
while ( fmod($a,$b) != 0 ) {
$r = fmod($a,$b);
$a = $b;
$b = $r;
if ( fmod($a,$b) == 0) {
return ($b);
}
}
if ($r == 0) {
return ($p);
}
}
$pgcd = PGCD($f1,$f2);
echo "<br>PGCD(".$f1.",".$f2.")=". $pgcd;
$ppcm = ( $f1 * $f2 ) / $pgcd;
echo "</br>PPCM(".$f1.",".$f2.")=". $ppcm;

?>
<form action="" method=GET><input type=text name="a" value="<?php echo $_GET['a']; ?>"/><input type=text name="b" value="<?php echo $_GET['b']; ?>"/><input type=submit value="Submit" style="background:aqua"/></form>

A voir également

Ajouter un commentaire Commentaires
Messages postés
192
Date d'inscription
lundi 24 décembre 2001
Statut
Membre
Dernière intervention
3 février 2010

Domage que tu soit chez free, si tu fait du développement en local, il existe des fonctions bien utile : Fonctions GMP
Sinon ton code source est pas mal.
Bonne continuation...
Messages postés
3
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
24 novembre 2006

je vais aller rebosser mon php moi alors...
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Ton tableau $prem n'étant pas censé évoluer en cours de boucle il est inutile d'appeler count dans cette dernière... .. .

Préférer les simples quotes aux doubles quotes... .. .

$fact = "$fact $a";

S'écrira

$fact .= ' '.$a;

de même pour

$m $m + 1; > $m += 1;
$d $d * ($m + 1); > $d *= ($m + 1);

Moi j'aurais bien vu lke tout sous forme de fonction... .. .

<?php

if(isset($_GET['num']) && !empty($_GET['num']))
{
function getFactor($n)
{
if(!is_numeric($n))
return false;
elseif(is_float($n))
return false;
elseif(!is_int($n)) // string ?
{
if(strpos($n,'.') !== false)
return false;
}

$fact $n.' ';

$a = 2;
while ($n > 1)
{
$b = $n / $a;

if (is_int($b))
{
$n = $b;
$f .= ' '.$a;
}
else $a++;
}

$o = 1;
$m = 1;
$d = 1;
$prem = explode(' ', $f);
$count = count($prem);

while($o < $count)
{
if ($prem[$o] === $prem[$o + 1])
$m += 1;

if ($prem[$o] !== $prem[$o + 1])
{
if ($o + 1 === $count)
{
$fact .= $prem[$o] .'^'. $m;
$d *= ($m + 1);
}
else
{
$fact .= $prem[$o] .'^'. $m .'*';
$d *= ($m + 1);
}
$m = 1;
}
$o++;
}

return array(
'fact' => $fact,
'div' => $d,
'isFirst' => ($d === 2)
);
}

$result = getFactor($_GET['num']);

if($result !== false)
{
echo $result['fact'].'
'.$_GET['num'].' admet exactement '.$result['div'].' diviseurs';

if($result['isFirst'])
echo '
'.$_GET['num'].' est premier';
}
else echo '
'.$_GET['num'].' n\'est pas numérique ou n\'est pas un entier !';
}
?>




<form action="?" method="GET">


</form>

@ tchaOo°
Messages postés
224
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
29 mars 2009

Une petite remarque...

Pour le PGCD, il vaut mieux utiliser l'agiorithme d'Euclide (plus rapide sur les grands nombres).
Pour le PPCM, il suffit d'utiliser PPCM(A;B)=A×B/PGCD(A;B).
Messages postés
3
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
24 novembre 2006

exemple d'utilisation...
euh je l'ai crée pour m'aider dans mes devoirs de spe maths niveau T°S (a l'origine je l'avais ecrit pour ma calculette)
bien sur on peut vite l'adapter pour trouver le pgcd, ppcm, et par extension en cryptographie.

sinon vu qu'il s'agit d'un script à usage personnel, je n'ai pas mis de maximum ou de script limitant l'entrée de characteres autres que des chiffres.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.