2012-03-11 4 views
4

Je travaille avec la cryptographie et je dois utiliser des nombres vraiment importants. J'utilise également la nouvelle instruction Intel pour la multiplication automatique qui requiert le type de données m128i, ce qui est fait en le chargeant d'une fonction qui prend en compte les données à virgule flottante.type de données personnalisé dans C

Je dois stocker 2^1223 entier, puis le mettre en carré et stocker cette valeur. 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 comme 2^1224 et 2^2448. Il y aura moins de frais généraux. Je vais utiliser karatsuba pour multiplier les nombres, donc la seule opération que j'ai besoin d'effectuer sur le type de données est l'addition car je vais décomposer le nombre pour qu'il corresponde à m128i.

Est-ce que quelqu'un peut me diriger dans la direction vers le matériel qui peut m'aider à créer la taille de l'entier dont j'ai besoin.

+4

Pensez-vous que le code que vous avez roulé sera plus rapide que le code qui a déjà été hautement optimisé (et débogué!)? (Bien que, si vous faites cela par intérêt, continuez comme vous étiez :)) – huon

Répondre

4

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

struct bignum_s { 
    char bignum_data[1024]; 
} 

(évidemment, vous voulez obtenir le bon dimensionnement, cela est juste un exemple)

La plupart des gens finissent par typedefing aussi bien:

typedef struct bignum_s bignum; 

Et puis créer des fonctions qui prennent deux (ou quelque chose) pointeurs sur 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 la plupart des fonctions dont vous avez besoin, y compris les fonctions d'allocation de mémoire (bignum_new), les fonctions de libération de mémoire (bignum_free) et les routines d'initialisation (bignum_init). Même si vous n'en avez pas besoin maintenant, le faire à l'avance vous permettra de savoir quand le code doit croître et se développer plus tard.

+1

Remarque: L'exemple ou la fonction est interrompue en raison de la valeur de transmission. Le 'a' de l'appelant ne changera pas. – unwind

+0

changé en pointeurs; Merci! –

Questions connexes