Calcul en binaire python

Bonjour à tous
Je me suis plongé dans un livre de crypto et je programme en Python ([large]M[/large]iller [large]R[/large]abin, exponentiation rapide etc).
Tous mes programmes fonctionnent avec des nombres en écriture décimale. Je voudrais maintenant plutôt utiliser des nombres binaires.
En python il y a la fonction bin() mais elle renvoie élément de type str. On peut évidemment convertir le nombre écrit en binaire en écriture décimale faire le calcul puis reconvertir en binaire. Mais je trouve ça un peu bête.
Bref y a-t-il en Python un moyen de calculer en binaire directement 100+100 ou 100**100 ou 100*100 ou 10000000//101 ou 1000000%101 sans avoir à programmer ces différentes opérations ?
Merci.

[Gary L. Miller et Michael Rabin (1931- ) prennent toujours une majuscule. AD]

Réponses

  • Je ne vois pas l’intérêt.
    Tu peux utiliser les opérateurs binaires (<<, >>, ^, |, &) sur des entiers.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Je pensais simplement que pour appliquer RSA, mon message à crypter sera écrit en base 2 (mon texte sera converti à l'aide du code ascii).
    Plutôt que d'avoir une clef publique en écriture décimale, je me disais que je pouvais avoir une clef publique en base 2 et faire directement le chiffrement de le déchiffrement en base 2. Après si ce n'est pas possible je convertis tout en base 10 je fais le chiffrement et le déchiffrement en base 10 puis je reconvertis en binaire. Mais je trouvais ça un peu plus compliqué.

    Je ne comprends pas ta remarque :
    >>> 10 <<10
    10240
    ce n'est pas un nombre écrit en base 2.
    Merci.
  • Tu utiliser n=int("10001101",2) pour convertir de binaire vers décimal et bin(141)[2:] dans l’autre sens.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Ok donc si je veux faire 100**100 en base 10 on fait donc : bin( int("100",2)**int("100",2))[2:] mais j'obtiens une chaîne de caractères donc il faut la remettre en integer si je souhaite refaire un calcul avec. Je suis donc obligé de l'écrire : int(bin( int("100",2)**int("100",2))[2:],2).
    100**100 en base 10 = int(bin( int("100",2)**int("100",2))[2:],2) ce n'est pas beaucoup plus simple.
    c'est un peu dommage que le résultat int("100",2)**int("100",2) ne soit pas un int en base 2. Ca serait plus simple, je pense.

    Bon je crois que le plus simple est de convertir mon message en base 2, en base 10 et de faire le chiffrement et le déchiffrement dans cette base, puis de reconvertir en base 2.
    Je te remercie Nicolas.
    Robert.
  • La base 10 une une manière de représenter les nombres.
    Par exemple, 10001101 écrit en base 2 représente en fait le nombre 141 écrit en base 10 et le nombre 8d écrit en hexadécimal ou le nom 215 écrit en octal.
    De la même manière que $\frac{3}{4}$, $0,75$, $1 - \frac{1}{4}$ ou $75 \%$ sont quatre écritures différentes du même nombre.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • @robert

    Essaie de décrire clairement et brièvement la première étape qui te bloque (pas tout l'algorithme de crypto, hein). Donne-nous l'entrée et ce qui est attendu en sortie.

    Pour calculer 100**100 où 100 est l'écriture binaire de 4, il est inutile de passer par les chaînes de caractères :
    >>> 0b100**0b100
    256
    
  • Vu son algorithme, je pense qu’il a des chaînes de caractère en entrée.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour Brian,
    et merci.
    On a juste besoin de faire des opérations de base puissances, multiplications et additions modulaires. J'ai vérifié avec ton écriture. Tout cela fonctionne sans problème. A la fin du calcul on obtient bien des nombres et pas des chaînes de caractères.
    Bonne soirée
    Robert
  • Le problème est donc réglé ? Si tu travailles avec des entiers comme ce que je viens de montrer, tu peux utiliser les opérateurs binaires que Nicolas a cités plus haut (voir Binary bitwise operations et Operator precedence dans la documentation officielle de Python 3). Cela devrait être raisonnablement rapide — pour du Python. En revanche, si tu réalises ces opérations sur des chaînes de caractères, tu vas sans doute devoir les implémenter toi-même et le résultat risque d'être beaucoup plus lent.
  • Bonjour Brian
    oui c'est réglé. Encore merci pour les infos
    Robert
Connectez-vous ou Inscrivez-vous pour répondre.