Int128 : une bibliothèque pour entiers sur 128 bits

Description


Int128 est une bibliothèque qui permet d'utiliser des entiers sur 128 bits ( ou 16 octets ), lesquels vont de -2^127 à 2^127-1, aussi facilement que les entiers natifs du langage C++ grâce à une classe spécialement développée pour cela. Chacun de ces entiers y est mémorisé par 2 entiers sur 64 bits : un int64_t et un uint64_t. La bibliothèque Int128 fournit principalement plusieurs constructeurs, l'affectation, les quatre opérations de base de l'arithmétique, l'exponentiation, la comparaison et la conversion en formats décimal et hexadécimal. Ces opérations et fonctions sont valides avec les entiers Int128, mais elles fonctionnent aussi entre les entiers Int128 et les entiers 64 bits ou 32 bits. Il y a deux cas de fin d'exécution en erreur dont la division par 0 : voir main.bat. Des fonctions supplémentaires peuvent assez facilement y être ajoutées : not, and, or, xor, les bit shifts, racine carrée ou même pgcd, ppcm et l'arithmétique modulaire, etc.

Contrairement aux bibliothèques GMP, NTL ou Boost qui permettent la multiprécison, c'est à dire l'emploi d'entiers de longueur aussi grande que nécessaire, Int128 ne permet que l'emploi d'entiers de longueur maximum 16 octets. Mais, l'avantage principal de Int128 est sa grande facilté d'emploi : il n'y a pas besoin d'un apprentissage compliqué. L'avantage secondaire est la maîtrise du code source, cependant les performances et l'exactitude sont peut être encore à contrôler, malgré les essais déjà effectués.

Pour en montrer l'emploi on a joint un programme qui vérifie que l'expression 4^n+6n-1 est divisible par 9, ce qui est vrai quelquesoit n. Ce programme en fait ici la démonstration pour n de 0 à 63. Avec des entiers sur 64 bits on est limité à 31.

Source :

 
// ----  fichier int128.hpp  --  @author pgl10  ----

#ifndef INT128_HPP
#define INT128_HPP

#include <stdint.h>
#include <string>

class Int128 {

public:
    ~Int128();
    Int128();
    Int128(int a);
    Int128(unsigned int a);
    Int128(int64_t a);
    Int128(uint64_t a);
    Int128(int64_t a, uint64_t b);
    Int128(const Int128& a);
    int64_t getHi() const;
    uint64_t getLo() const;
    void setHi(const int64_t a);
    void setLo(const uint64_t a);
    Int128 operator  - () const;
    Int128 operator  = (const Int128& a);
    Int128 operator += (const Int128& a);
    Int128 operator  - (const Int128& a) const;
    Int128 operator -= (const Int128& a);
    Int128 operator *= (const Int128& a);
    Int128 operator  / (const Int128& a) const;
    Int128 operator /= (const Int128& a);
    Int128 operator  % (const Int128& a) const;
    Int128 operator %= (const Int128& a);
    Int128 operator ++ ();
    Int128 operator ++ (int);
    Int128 operator -- ();
    Int128 operator -- (int);
    int signe() const;
    std::string hexa() const;
    std::string deci() const;

private:
    int64_t  _hi;
    uint64_t _lo;
};

Int128 operator  + (const Int128& l, const Int128& r);
Int128 operator  - (const int& l, const Int128& r);
Int128 operator  * (const Int128& l, const Int128& r);
bool   operator == (const Int128& l, const Int128& r);
bool   operator != (const Int128& l, const Int128& r);
std::ostream& operator << (std::ostream& ost, const Int128& v);
int cmp128(const Int128& a, const Int128& b);
Int128 pow128(const Int128& x, const int& n);
int64_t toInt(const Int128& a);

#endif // INT128_HPP

// ----  fichier main.cpp  --  @author pgl10  ---- 

#include <iostream>
#include "int128.hpp"

void main() {
    Int128 p, q;
    std::cout << std::endl << "n : p = 4^n+6*n-1 = 9*q" 
              << std::endl << std::endl;
    for(int n=0; n<64; n++) {
        p = pow128(4,n) + 6*n - 1;
        q = p / 9; 
        if(p == 9*q) 
          std::cout << n << " : " << p << " = 9*" << q << std::endl;
    }
    std::cout << std::endl << std::endl;
}

Conclusion :

Cette bibliothèque Int128 est aussi un bon exercice de programmation C++. Merci pour vos commentaires et remarques.

Codes Sources

A voir également

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.