IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Implementation d'un entier 128 bits


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut Implementation d'un entier 128 bits
    Bonjour,

    Je cherche actuellement une implémentation d'une classe arithmétique d'un entier 128 bits .

    BigInteger ne m'intéresse pas , à cause de ses performances désastreuses tant en terme de CPU que de RAM (Cette classe est prévue pour être générique, moi, je veux du 128 "dur")

    A défaut, j'ai commencé mon affaire en manipulant 2 longs, mais les opérations e multiplication/division me donnent du fil à retordre.

    Quelqu'un connais une implémentation pour ça ?
    Sinon, je vais coder un truc en C++ et le wrapper avec du JNI

  2. #2
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    créer une classe qui utilise un Bitset? (je n'ai aucune idée des perfs de Bitset )
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Bitset est lent, très lent si tu veux en faire un entier de 128nits. Il est prévu pour servir de tableau de booléens, pas pour faire de nombreuses opération de changement dessus.

    Qu'est-ce qui te pose problème pour la division / multiplication?

    Tu peux utiliser la division par soustraction (la plus simple) qui n'est pas très performante ou le complexe Newton–Raphson.

    Mais pourquoi tu refuse de déléguer ce travail à BigInteger?

  4. #4
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut
    Il y a une chose que je veux dans java, c'est les templates.

    Je me dis qu'un bigInteger( new byte[16]) doit être extremmement lent par rapport a un bigInteger<16>..

    Peut être je devrais recoder cette classe ?

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ce n'est pas beaucoup plus lent de manipuler 2 long que de manipuler 4 long. Le code reste le même, la seul différence, c'est que les opération auront 4 étapes au lieu de 2.

    Si tu regarde le code de BigInteger, je ne vois pas ce que tu voudrais ajouter comme optimisation

    Ce que tu appelle des template, ça s'appelle des Generic en java, et ça prend en paramètre un type, pas une valeur, comme les template c++

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Si tu regarde le code de BigInteger, je ne vois pas ce que tu voudrais ajouter comme optimisation
    L'utilisation de paires de long (ou autres types de base) au lieu d'objets, et l'absence de généricité sur la taille des données, faisant du temps de calcul en moins. Ça donne déjà des bons résultats si on fait presque rien que des calculs.

    Si on décide d'utiliser des objets, les rendre mutables permet de soulager un peu le pool d'objets.

    ... Mais je dois avouer que j'ai jamais su faire des multiplications ou divisions en binaire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ouais, ben si les performances sont critiques à ce point => JNI et tu fais faire le calcul par le GPU qui a lui un bus de 128 bits via opencl


    Blague à part, si la multiplication / division donne du fil à retordre, je ne vois pas en quoi passer par JNI + C va résoudre le problème. Ton problème d'algorithme restera le même.

    Au pire tu prend le code source de la class BigInteger (openjdk), tu remplace son tableau interne de ints par 4 ints et tu déroule manuellement toutes les boucles, et tu fait une nouvelle classe avec ça.

Discussions similaires

  1. Entiers de 128 bits
    Par gorgonite dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/01/2013, 09h47
  2. Entier : accès bit à bit
    Par slylafone dans le forum C++Builder
    Réponses: 16
    Dernier message: 14/06/2005, 20h34
  3. Entier 64 bits sous linux, problème d'affectation
    Par Steki-kun dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 21h10
  4. déclaration de variables de 16, 32 et 128 bits
    Par samipate dans le forum C++
    Réponses: 10
    Dernier message: 30/12/2004, 22h33
  5. Machine 32 bits - cryptage 128 bits
    Par free0pen dans le forum Assembleur
    Réponses: 6
    Dernier message: 02/04/2004, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo