Division en Python — Les-mathematiques.net The most powerful custom community solution in the world

Division en Python

Comment puis-je faire pour savoir si la division suivante est un entier sur le langage Python.
24851019416975905487621263710649527109156864 / 211
Je sais que c'est entier théoriquement.
Merci

Réponses

  • Bonjour,

    je ne sais plus s'il y a une blagounette pour les versions 2.x mais pour 3.y voir ci-dessous.

    S33999
  • Autrement dit il faut doubler le slash codant la division
    a=3
    b=2
    print(a//b)
    Le quotient de la division euclidienne de a par b est alors renvoyé.
    Référence : voir wiki par exemple.
  • Calculer le quotient dans la division euclidienne n'est pas la même chose que vérifier si "la division tombre juste" ! Si on veut le reste, c'est % :

    24851019416975905487621263710649527109156864%211

    Et on trouve alors le reste : 78. Donc, la fraction n'est pas un entier.
  • Bonjour,
    Je trouve que cette question serait un bon exercice d'algorithmique (et on pourra aussi écrire le code) sachant que les entiers sont codés sur 32 bits.
  • les entiers sont codés sur 32 bits.
    Pas les entiers longs. L'arithmétique avec les entiers longs est implantée dans tout un tas de logiciels. On peut aussi vouloir le refaire tout seul....
  • Bonjour GZ,
    Tu sais, quand j'ai appris a faire des calculs, je travaillais avec une table de log à 5 décimale.
    Puis j'ai utilisé des machines pour faire des calculs, alors cette préoccupation de précision liée plus à la méthode qu'au nombre des chiffres est restée dans ma tête.

    Je ne connais pas "entiers longs", je ne connais que les "long" sur 32 bits.
    Mais je me doutais qu'on me dirait cela, c'est pourquoi j'ai écrit "sachant que les entiers sont codés sur 32 bits".

    On a tellement de logiciels qu'on les met en "tas" ? (:D
  • Tu crois être le seul à avoir utilisé Bouvard et Ratinet et la règle à calcul ?
    Et comment codes-tu l'entier 24851019416975905487621263710649527109156864, sujet de ce fil, sur 32 bits ?
    Donc, si tu veux manipuler ce type d'entiers, ou bien tu utilises un langage qui le fait (par exemple python, dont il est question ici), ou bien tu réinventes la roue dans ton coin à titre d'exercice. On s'amuse comme on peut et comme on veut.

    PS : Bouvard et Bouvart, ou Dupond et Dupont chez Flaubert.
  • Bouvard et Pécuchet
  • Concernant la table de log, naturellement je sais que je ne suis pas le seul, sinon, j'en parlerais pas.
    Concernant le très grand nombre, il est vrai que je ne vois pas très bien l'intérêt de faire ce type de calcul, sauf dans le cadre d'un exercice.
    Comme j'ai passé l'age de faire des exercices, je me contente d'en proposer.
  • Sinon, tu utilises un critère de divisibilité par 211 en multipliant le dernier chiffre par 21 et en soustrayant au reste du nombre mais bon.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • @dlzlogic,
    De grands nombres ? tu connais le cryptage par RSA ?
  • En Python, les opérations de base sont :
    • + (somme)
    • - (moins)
    • * (multiplication)
    • / (division dans les nombres à virgule)
    • // (quotient de la division euclidienne)
    • % (reste de la division euclidienne)

    Il ne faut pas oublier les deux dernières opérations, très utiles.
    Ici % devrait faire ton bonheur. Comme dit plus haut, si le reste est nul c'est que la division tombe pile, sinon c'est que le rapport n'est pas entier.
  • Ça, c’est pour Python 3. En Python 2, // n’existe pas et / est (entre deux entiers) une division euclidienne.
    Et ** est la puissance.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Mon problème est en fait dû à ma difficulté de pouvoir programmer en python des variables qui doivent prendre des valeurs entières très grandes comme par exemple le cas suivant :

    n := (5* * 209 -1)/3, la variable (n) s´affiche sous forme d'une exponentielle, alors que la démarche nécessite des valeurs entières pour vérifier une formule que j'ai développée.
    Si quelqu'un peut m'aider à savoir comment faire des calculs avec des entiers très très grands, disons n := 5* * 2015.
    Ou me proposer des logiciels qui peuvent le faire.
    Merci.
  • Bonsoir,
    Je vais essayer de faire une réponse humoristique.
    Question : le nombre 452873 est-il divisible par 13 ?
    Réponse : il suffit de prendre une bonne calculette.
    Les nombres très grands nécessitent des méthodes particulières. Il y a effectivement des logiciels qui font cela.
    Réponse à votre question : il suffit de trouver le bon logiciel.
  • Sur mon installation, ça donne bien un entier long (au sens précion arbitraire). Voir plus bas.

    Par ailleurs je lis dans la documentation de Sage (logiciel de calcul formel libre et gratuit écrit en Python) :

    "Entiers longs : Python possède nativement un support pour les entiers de précision arbitraire, en plus des int du langage C. Les entiers longs Python sont significativement plus lents que ceux que GMP fournit et sont marqués à l’affichage par un L qui les distingue des int (il est pas prévu de changer cela à court terme). Sage implémente les entiers en précision arbitraire en utilisant la bibliothèque C GMP. Les entiers longs GMP utilisés par Sage s’affichent sans le L."34021
  • akdim, tu utilises Python 3, c’est pour ça. En Python 3, la division euclidienne est //.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour,

    À noter :
    En Python 3, les entiers sont tous illimités. Le suffixe L et la fonction long() sont abandonnés.

    Et effectivement (noter la différence entre les deux divisions en Python 3) :
    Python 3.3.0 (default, Feb 14 2013, 17:06:31) 
    [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    No entry for terminal type "xterm-256color";
    using dumb terminal settings.
    >>> (5**209-1)/3
    4.051442238190847e+145
    >>> (5**209-1)//3
    40514422381908474655885833683464350524676120890111765189460394627537101784084527611874640775558031360396917900749495326332786741356054941813151041
    

    Cordialement,

    Ritchie
  • Bonjour,
    Akdim a écrit:
    Si quelqu'un peut m'aider à savoir comment faire des calculs avec des entiers très très grands, disons n := 5* * 2015.
    5* * 2015=
    26580230152030080186694932540218726488827831246049159596690347990412258463764243
    81648174667602474328938465602776322973826966645010982768653894894660804149432709
    20124582223428907705966900326825678956865348570933446979706942662689923504048713
    42207948999744545817611204448413364099358326998424771947809320433011204059364529
    89716847366566698294002344654744338498883089986442769975710540358297791986724049
    63345564382070071749413665563057454561603304027156858738250927488358054228273518
    94490916879426785680015734169999521460578444605407294694052499336546712868092232
    34317367733759814665490115078492978972379262502788779746851496573403612680901083
    72674485319229953648403143807921495350639733918732902632155324641630692574104441
    58486805585584237471377931316990278931534988145339851899014248243231639296927656
    57832110734378382433443475846141853966177666618327664649856132047217341758640347
    01109494679383368132542791914092128614054658561640568320311010267764771154480588
    76577727147166932227152889955726770431111559874617472922473303890796009007639921
    96726156005520701090013227239824874920236595854933990496210576821875508890583621
    74192946108811475743582125643401334913027090164832779556762422622243042176522601
    77242465224109217008717223270706742939597042562371505937984039846752485108313294
    61678449470640692202002020916341068665992971052679913085272470934865260389859689
    7866288442380255929720078711397945880889892578125
    avec Pyzo (Python 3.4.1 sur Windows 7)

    Cordialement

    Rescassol
  • merci , Rescassol.

    peux tu faire cette division 5* * 2015 % 5 ,
  • Vous pouvez faire ce calcul directement sur ce site : http://www.compileonline.com/execute_python_online.php

    Ou alors vous pouvez le faire "à la main". Est-ce que $5$ est un diviseur de $ 5^{2015}$ ?
  • akdim a écrit:
    peux tu faire cette division 5* * 2015 % 5 ,
    pow(5,2015,5)
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • BONJOUR:
    Je voudrais savoir comment installer python sur linux
    merci.
  • Bonjour,

    Par exemple: Pyzo et suivre les instructions.

    Cordialement,

    Rescassol
  • La plupart du temps, il est déjà installé.
    Sinon, cherche les paquets tous prêts pour ta distribution, pas besoin d’aller chercher un truc sur un site.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • J'ai ce problème cher ami(e)

    Considère un nombre à quatre chiffres: exemple 5138, 9998, 1028, 1111, etc. Suppose que tu
    regardes le nombre M = 5138. Tu peux prendre les quatre chiffres de M et réarranger ces chiffres
    de M pour obtenir le plus grand nombre possible que l’on puisse faire avec ces chiffres, Mbig = 8531; aussi
    Tu peux réarranger pour avoir le plus petit nombre possible Msmall = 1358. Écris une fonction qui
    fait ce genre de calcul.
  • Où en es-tu ?
  • Bonjour,

    quelqu'un a-t-il la méthode pour décomposer des très grands nombres ? Une division euclidienne classique (flottants vs entiers) convergera-t-elle ?

    Merci....
  • Peux-tu être plus précis ?
    A priori, il n’existe pas d’algorithme efficace pour décomposer les entiers en produit de nombres premiers.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour,

    Par exemple:
    import giacpy as giac
    
    N=2**128+1
    T=giac.ifactor(N)
    print(T)
    

    Cordialement,

    Rescassol
  • Merci Rescassol çà marche. @nicolas.patrois...

    J'ai une deuxième question. J'essaie de créer la paire clé publique / clé privée de cette manière préconisée pour le déchiffrement:
    - 1. on choisit deux nombres premiers p et q
    - 2. le produit p*q donne alors le module n
    - 3. on calcule z=(p-1)(q-1)
    - 4. on choisit un nombre e premier avec z (on prend généralement e premier, mais il faut bien vérifier qu’il soit premier avec z)
    - 5. on calcule d, inverse de e modulo z, c’est à dire le nombre inférieur à z tel que le reste de la division de e×d par z soit égal à 1

    Peut-on avoir une méthode simple pour 4 et 5 ?

    Merci....
  • @Rescassol, elle est puissante cette librairie Giacpy. Comment a-t-elle spécifié de gérer les grands nombres ?

    Merci du retour
  • Romyna a écrit:
    J'ai une deuxième question. J'essaie de créer la paire clé publique / clé privée de cette manière préconisée pour le déchiffrement:
    - 1. on choisit deux nombres premiers p et q
    - 2. le produit p*q donne alors le module n
    - 3. on calcule z=(p-1)(q-1)
    - 4. on choisit un nombre e premier avec z (on prend généralement e premier, mais il faut bien vérifier qu’il soit premier avec z)
    - 5. on calcule d, inverse de e modulo z, c’est à dire le nombre inférieur à z tel que le reste de la division de e×d par z soit égal à 1

    Oh, un RSA. :-D
    Peut-on avoir une méthode simple pour 4 et 5 ?

    4- Tu choisis un nombre au hasard entre des bornes que tu te donnes, ensuite tu utilises nextprime.
    5- Ça ressemble fortement à un algorithme d’Euclide généralisé (Bézout, quoi).
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonsoir,

    Quel rapport avec l'égalité : (d*e) mod Z = 1 où d est la clé à calculer et Bézout ou Euclide étendu ? Ci-dessous deux exemples d'implémentation.
    Existe-t-il un décodeur RSA des grands nombres car mon programme parvient à des dépassements de taille de pile et n'aboutit pas en calculs ?


    J'ai modifié mon code avec l'indication d'une fonction permettant le calcul de d. Il me manquait une fonction de librairie adaptée à Python v3.8.2.
    #import sys
    import giacpy as giac
    from binascii import unhexlify
    
    N=10327849034940138613515485956077213322791085874638285662823764630659653931824178919168344401508423966366637831067655701114352106747323628144645384205073278784870804834942988268503504130770762781798270763453272421050209487483563600870343875197428105079394315585993355808937811229959083289653056248770988647762812998870912510238393368777882358059256678052653963583286245796285737035786447522814310717433588049686223718247661713594680120785280795132759253149754143640871380226770164628599577669124463514838464342769690232097283333816896581904763736283142031118073027496197756777460403007359764250621763279762041468943079
    n = 632459103267572196107100983820469021721602147490918660274601
    p = 0
    e= 65537 #hypothèse posée
    c = 63775417045544543594281416329767355155835033510382720735973
    for i in range(2, 1000000):
        if N % i == 0:
          
            print("Factor found: " + str(i))
            p = str(i) 
            break
    
    #N=2**128+1
    T=giac.ifactor(N)
    t=giac.ifactor(n)
    #print(T)
    print("décomposition p*q=t=")
    print(t)
    Z = 622751*16584235167731787847013470803061277015678956556694867873072487447887926204573222554710220299137896151698893829263470795092022504576184748229263470795092022504576184748229461509022182668168932373990476110465504678644868916760949835108178505407538822880225959950113859004542443496612744506663932043264799941076095252059950113859004542443496612744563482124073298940744796576800151123820336528353672466777796149161099248732899206255277346414021097764537645521638337450661718385755338513002335497796149161099248732899206255277182670571055097076123763351325924997427587424504748731776692547858422108949105868315872104780985522044066316665393121965734834334905254114025888811325924997427587424504748731773056980012499780203906986519558328
    z= 650655447295098801102272374366*972033825117160941379425504502
    print("Z= (p-1)(q-1)")
    print(Z)
    print("z= (p-1)(q-1)")
    print(z)
    D = pow(e, -1, Z)
    print("private key D=")
    print(D)
    d = pow(e, -1, z)
    print("private key d=")
    print(d)
    intmsg = pow((c), D, N)
    intmsg1 = pow((c), d, n)
    
    print("initial message M=")
    print(intmsg)
    print("initial message m=")
    print(intmsg1)
    message = "%2X" % intmsg
    print ("Plain : %s" % unhexlify(message))
    
    


    Merci et à bientôt....
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!