type de données personnalisé en C

Je travaille avec la cryptographie et dois utiliser des nombres très grands. J’utilise également la nouvelle instruction Intel relative à la multiplication sans retenue, qui requirejs le type de données m128i. Elle est chargée en la chargeant d’une fonction prenant les données en virgule flottante comme arguments.

Je dois stocker 2 ^ 1223 entier, puis le carré et stocker cette valeur aussi.

Je sais que je peux utiliser la bibliothèque GMP, mais je pense qu’il serait plus rapide de créer deux types de données qui stockent des valeurs telles que 2 ^ 1224 et 2 ^ 2448. Je vais utiliser karatsuba pour multiplier les nombres, de sorte que la seule opération à effectuer sur le type de données est l’addition, car je vais décomposer le nombre pour l’adapter à m128i.

Quelqu’un peut-il me diriger vers le matériel qui peut m’aider à créer la taille de l’entier dont j’ai besoin.

Si vous avez besoin de vos propres types de données (que ce soit pour les maths, etc.), vous devrez recourir à des structures et à des fonctions. Par exemple:

struct bignum_s { char bignum_data[1024]; } 

(évidemment vous voulez avoir le bon dimensionnement, ceci est juste un exemple)

La plupart des gens finissent par le dactylographier également:

 typedef struct bignum_s bignum; 

Et créez ensuite des fonctions qui prennent deux pointeurs (ou autre) vers les nombres pour faire ce que vous voulez:

 /* takes two bignums and ORs them together, putting the result back into a */ void bignum_or(bignum *a, bignum *b) { int i; for(i = 0; i < sizeof(a->bignum_data); i++) { a->bignum_data[i] |= b->bignum_data[i]; } } 

Vous voulez vraiment définir presque toutes les fonctions dont vous avez besoin, ce qui inclut souvent des fonctions d’allocation de mémoire ( bignum_new ), des fonctions de libération de mémoire ( bignum_free ) et des routines d’initialisation ( bignum_init ). Même si vous n’en avez pas besoin maintenant, le faire à l’avance vous préparera au moment où le code doit évoluer et se développer plus tard.