begin process at 2012 05 27 16:14:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > FACTORISATION D'UN ENTIER EN PRODUIT DE NOMBRES PREMIERS AVEC UNE FONCTION RÉCURSIVE

FACTORISATION D'UN ENTIER EN PRODUIT DE NOMBRES PREMIERS AVEC UNE FONCTION RÉCURSIVE


 Description

Cliquez pour voir la capture en taille normale
Ce programme affiche les facteurs premiers composant le nombre entré en paramètre, grâce à un algorithme de récurrence très rapide, et très efficace, même avec les grands nombres.

La fonction qui détermine si un nombre est premier commence par tester sa parité (si paire, pas premier...). Ensuite, il teste le modulo de tous les nombres impaires compris entre 3 et la racine du nombre.

La fonction qui trouve les facteurs teste tous les nombres compris entre 2 et la racine du nombre. Si un nombre est un diviseur de n:

  * Si ce diviseur est premier:
      * Affiche ce diviseur
      * Divise n par ce nombre
      * Recommence la recherche, entre 2 et la racine du n initial pour trouver les autres diviseurs

  * Si ce diviseur n'est PAS premier:
      * Récursivité avec le diviseur non-premier en paramètre afin de décomposer ce nombre
      * Recommence la recherche, entre 2 et la racine du n initial pour trouver les autres diviseurs

Source

  • #include <stdio.h>
  • #include <conio.h>
  • #include <math.h>
  • void PrintFactor(unsigned int n)
  • {
  • //Affichage d'un facteur à l'écran
  • printf("Un facteur est: %d\n", n);
  • return;
  • }
  • //Cette fonction teste si un nombre
  • //est premier ou pas.
  • // true: Est premier
  • // false: N'est pas premier
  • bool IsPrime(unsigned int n)
  • {
  • if (n<=2)return(true);
  • //Ici, on vérifie directement s'il est
  • //paire. Si oui, il n'est surement pas
  • //premier...
  • if (n%2==0)return(false);
  • /* La limite de la plage de test
  • est la racine carrée du nombre à tester:
  • RACINE( n ) * RACINE( n ) = n
  • donc si il y a un diviseur, il sera forcemement
  • compris entre 1 et RACINE( n )
  • */
  • unsigned int sq = pow(n, 0.5);
  • //On test le modulo de tous les
  • //nombres impaires entre 3 et RACINE( n )
  • for (int i=3;i<sq+1;i+=2)
  • if (n%i==0)return(false);
  • return(true);
  • }
  • void fact(unsigned int n)
  • {
  • //n premier ?
  • //On quitte après avoir affiché le nombre
  • if (IsPrime(n)==true)
  • {
  • PrintFactor( n );
  • return;
  • };
  • unsigned int sq = pow(n, 0.5);
  • unsigned int i = 2;
  • //On sait que si il y a un diviseur,
  • //premier ou non, il sera compris entre 2 et RACINE( n )
  • while (i<sq+1)
  • {
  • if ( n%i==0 )
  • {
  • if ( IsPrime( i ) )
  • {
  • /* Si i est un diviseur premier,
  • * on l'affiche, puis on continue les recherches
  • * sur le quotient de n par i
  • */
  • PrintFactor( i );
  • n = (n / i);
  • i = 1;
  • }
  • else
  • {
  • //i est un diviseur non-premier ?
  • //on approffondit la recherche des facteurs
  • //sur ce nombre avec la récurrence sur fact( unsigned int )
  • fact( i );
  • i = 1;
  • };
  • };
  • //Le nombre n est finalement premier après
  • //avoir été réduit, alors on affiche ce nombre,
  • //qui sera donc le dernier facteur du n initial.
  • if ( IsPrime( n ) )
  • {
  • PrintFactor( n );
  • return;
  • };
  • i++;
  • };
  • return;
  • }
  • int main(void)
  • {
  • unsigned int nbr = 0;
  • printf("Entrez un nombre: ");
  • scanf("%d", &nbr);
  • fact(nbr);
  • getch();
  • return(0);
  • }
#include <stdio.h>
#include <conio.h>
#include <math.h>

void PrintFactor(unsigned int n)
{
    //Affichage d'un facteur à l'écran
    printf("Un facteur est: %d\n", n);
    return;
}

//Cette fonction teste si un nombre
//est premier ou pas.
// true: Est premier
// false: N'est pas premier
bool IsPrime(unsigned int n)
{
    if (n<=2)return(true);

    //Ici, on vérifie directement s'il est
    //paire. Si oui, il n'est surement pas
    //premier...
    if (n%2==0)return(false);

    /* La limite de la plage de test
       est la racine carrée du nombre à tester:
           RACINE( n ) * RACINE( n ) = n
       donc si il y a un diviseur, il sera forcemement
       compris entre 1 et RACINE( n )
    */
    unsigned int sq = pow(n, 0.5);

    //On test le modulo de tous les
    //nombres impaires entre 3 et RACINE( n )
    for (int i=3;i<sq+1;i+=2)
        if (n%i==0)return(false);

    return(true);
}

void fact(unsigned int n)
{
    //n premier ?
    //On quitte après avoir affiché le nombre
    if (IsPrime(n)==true)
    {
        PrintFactor( n );
        return;
    };

    unsigned int sq = pow(n, 0.5);
    unsigned int i = 2;

    //On sait que si il y a un diviseur,
    //premier ou non, il sera compris entre 2 et RACINE( n )
    while (i<sq+1)
    {
        if ( n%i==0 )
        {
            if ( IsPrime( i ) )
            {
                /* Si i est un diviseur premier,
                 * on l'affiche, puis on continue les recherches
                 * sur le quotient de n par i
                 */
                PrintFactor( i );
                n = (n / i);
                i = 1;
            }
            else
            {
                //i est un diviseur non-premier ?
                //on approffondit la recherche des facteurs
                //sur ce nombre avec la récurrence sur fact( unsigned int )
                fact( i );
                i = 1;
            };
        };

        //Le nombre n est finalement premier après
        //avoir été réduit, alors on affiche ce nombre,
        //qui sera donc le dernier facteur du n initial.
        if ( IsPrime( n ) )
        {
            PrintFactor( n );
            return;
        };
        i++;
    };
    return;
}

int main(void)
{
    unsigned int nbr = 0;
    printf("Entrez un nombre: ");
    scanf("%d", &nbr);
    fact(nbr);
    getch();
    return(0);
}



 Sources du même auteur

Source avec Zip A2DCRYPT - CRYPTAGE 2048 BITS
Source avec Zip MORPION MINI JEU PRIMITIVE ARTIFICIAL INTELLIGENCE

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture TROUVER LES NOMBRES PREMIERS INFÉRIEURS À UNE LIMITE DONNÉE par angrevol
Source avec une capture FACTORISATION D'UN NOMBRE par Faibbus
Source avec Zip UN MICROSCOPE NUMÉRIQUE POUR REGARDER LES NOMBRES DANS TOUTE... par euclidoscope
Source avec Zip Source avec une capture SPIRALE D'ULAM (WIN32) par vecchio56
Source avec Zip NOMBRES PREMIERS AVEC CHRONO ET INCREMENTEUR INCORPORÉ par sebman

Commentaires et avis

Commentaire de opossum_farceur le 24/02/2010 00:05:18

Hi!
Utiliser la fonction "sqrt" plutôt que "pow" (qui fait appel à l'exponentielle) te permettrait certainement de gratter quelques millisecondes pour les nombres importants. J'ai pas testé ton code mais ton algorithme a l'air intéressant.

Commentaire de christianparis le 01/03/2010 20:50:50

Salut,
Il semble que tu pourrais accélérer ton algorithme...
En regardant la fonction Isprime : à la ligne 36, quand IsPrime() retourne false, la valeur de i est le plus petit des facteurs premiers de n. Or tu ne te sers pas de ce résultat, si bien qu'à la ligne 60, lorsque IsPrime() est false(), tu appelles à nouveau fact() pour retrouver ce résulat déjà calculé...
Dans la boucle while de la ligne 56 à la ligne 89, tu incrémentes i de 1 (ligne 88): la moitié des valeurs de i dans cette boucle seront donc des nombres pairs(qui n'auront aucune chance d'être premiers), ce que tu pourrais éviter en incrémentant de 2 en 2(en commençant par la valeur 3, après avoir fait un cas particulier en tout début de programme pour le diviseur 2)

Commentaire de azizyah le 01/03/2010 23:24:55

Je n'ai pas encore utilisé ce code. mais il parait que la logique de l'editeur ne se base sur aucune logique de mathematicien. il dit clairement " La fonction qui détermine si un nombre est premier COMMENCE PAR TESTER SA PARITE3 -ET LE PLUS GRAVE -(SI PAIRE PAS PREMIER...)" totalement faut car 2 est paire et il est premier.
posté par: Aziz YAHIAOUI - Architecte - demeurant à Sour El Ghozlane, Algérie- Email azizyah@msn.com
bonne continuation.

Commentaire de tagtog le 03/03/2010 23:26:42

Merci Pour le code, il est très intéressant pour calcule quelques problèmes mathématique, a bien tôt pour la deuxième version!  

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

nombre premier [ par djkill55 ] bonjour, je doi faire un programe ki verife si le nb ke je rentre est premier ou pa a l aide de fonction et je n ai ocune idee cmt faire...aidez moi s Programme sur les nombres entiers [ par K20 ] Bonjour tout le monde ! Je suis nouveau ici et j'ai un probl&#232;me avec un programme en C++ ... j'utilise Dev C++ 3.0. J'ai fait un programme qui pe nombre premier [ par igor941 ] bonjour je suis etudiant et j'ai un tp à réaliser j'aurai besoin d'une petite aide de la part de quelqu'un se debrouillant en C puisque je debute en C nombres premiers [ par YkS ] Bonjour à tous, je suis actuellement étudiant en BTS IRIS, et j'ai un TD à faire, qui peut paraître assez simple mais dont je ne vois pas comment me s nombre de colonne bdd access [ par ouamtax ] Bonjour,existe t'il un moyen de connaitre le nombre de colonnes d'une table soit par requete SQL soit par une instruction C.En C, pour l'exécution d'u convertion tab de char vers tab de int [C++] [ par Selune6666 ] Bonjour,Je suis actuellement sur un projet de convertisseur de base (dec, binaire, hexa , octal) en C++Mon utilisateur entre le nombre a convertir dan Langage C, Structure. [ par Aberad ] Bonjour,Je suis un débutant du langage C, je cherche à faire un programme simple qui consiste juste à afficher la partie Réelle d'un nombre complexe q nombre de commentaires [ par akim77 ] Bonjour,Serait-il possible d'avoir,dans la partie centrale "Derniers Codes &amp; Tutoriaux",  le nombre de commentaires pour chacun des derniers codes Probleme de nombre [ par fred2541 ] Bonsoir.Je un petit probleme avec mon programme en c.je recupere des info dans une basse sql, et j'ai un champ qui contient un nombre(1 ou 2).Je n'arr Fenetre sdl au premier plan [ par fred2541 ] BonjourSavez vous s'il et possible d'afficher une fenetre sdl au premier plan?Un peut comme le logiciel xfire, je voudrais que quand je suis sur un je


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,371 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales