gcd now can also use heap memory
This commit is contained in:
parent
431b00c6b3
commit
a30df60ac8
|
@ -32,13 +32,22 @@
|
||||||
|
|
||||||
#include "bigint.h"
|
#include "bigint.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#define PREFERE_HEAP_SPACE 1
|
#define PREFERE_HEAP_SPACE 1
|
||||||
|
|
||||||
#if PREFERE_HEAP_SPACE
|
#if PREFERE_HEAP_SPACE
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define ALLOC_BIGINT_WORDS(var,words) bigint_word_t *(var) = malloc((words) * sizeof(bigint_word_t))
|
#define ALLOC_BIGINT_WORDS(var,words) \
|
||||||
|
bigint_word_t *(var) = malloc((words) * sizeof(bigint_word_t)); \
|
||||||
|
if (!(var)) { \
|
||||||
|
puts_P(PSTR("\n\nDBG: OOM ERROR (in arithmeics)!\n")); \
|
||||||
|
uart0_flush(); \
|
||||||
|
for(;;) \
|
||||||
|
; \
|
||||||
|
}
|
||||||
|
|
||||||
#define FREE(x) free(x)
|
#define FREE(x) free(x)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -50,11 +59,10 @@
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 1
|
||||||
|
|
||||||
#if DEBUG || 1
|
#if DEBUG
|
||||||
#include "cli.h"
|
#include "cli.h"
|
||||||
#include "uart_i.h"
|
#include "uart_i.h"
|
||||||
#include "bigint_io.h"
|
#include "bigint_io.h"
|
||||||
#include <stdio.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MAX
|
#ifndef MAX
|
||||||
|
@ -881,17 +889,24 @@ void bigint_gcdext(bigint_t *gcd, bigint_t *a, bigint_t *b, const bigint_t *x, c
|
||||||
while(x->wordv[i] == 0 && y->wordv[i] == 0){
|
while(x->wordv[i] == 0 && y->wordv[i] == 0){
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
bigint_word_t g_b[i + 2], x_b[x->length_W - i], y_b[y->length_W - i];
|
|
||||||
bigint_word_t u_b[x->length_W - i], v_b[y->length_W - i];
|
|
||||||
bigint_word_t a_b[y->length_W + 2], c_b[y->length_W + 2];
|
|
||||||
bigint_word_t b_b[x->length_W + 2], d_b[x->length_W + 2];
|
|
||||||
bigint_t g, x_, y_, u, v, a_, b_, c_, d_;
|
|
||||||
|
|
||||||
g.wordv = g_b;
|
ALLOC_BIGINT_WORDS(g_w, i + 2);
|
||||||
x_.wordv = x_b;
|
ALLOC_BIGINT_WORDS(x_w, x->length_W - i);
|
||||||
y_.wordv = y_b;
|
ALLOC_BIGINT_WORDS(y_w, y->length_W - i);
|
||||||
memset(g_b, 0, i * sizeof(bigint_word_t));
|
ALLOC_BIGINT_WORDS(u_w, x->length_W - i);
|
||||||
g_b[i] = 1;
|
ALLOC_BIGINT_WORDS(v_w, y->length_W - i);
|
||||||
|
ALLOC_BIGINT_WORDS(a_w, y->length_W + 2);
|
||||||
|
ALLOC_BIGINT_WORDS(c_w, y->length_W + 2);
|
||||||
|
ALLOC_BIGINT_WORDS(b_w, x->length_W + 2);
|
||||||
|
ALLOC_BIGINT_WORDS(d_w, x->length_W + 2);
|
||||||
|
|
||||||
|
bigint_t g, x_, y_, u, v, a_, b_, c_, d_;
|
||||||
|
|
||||||
|
g.wordv = g_w;
|
||||||
|
x_.wordv = x_w;
|
||||||
|
y_.wordv = y_w;
|
||||||
|
memset(g_w, 0, i * sizeof(bigint_word_t));
|
||||||
|
g_w[i] = 1;
|
||||||
g.length_W = i + 1;
|
g.length_W = i + 1;
|
||||||
g.info = 0;
|
g.info = 0;
|
||||||
x_.info = y_.info = 0;
|
x_.info = y_.info = 0;
|
||||||
|
@ -912,12 +927,12 @@ void bigint_gcdext(bigint_t *gcd, bigint_t *a, bigint_t *b, const bigint_t *x, c
|
||||||
bigint_shiftright_bits(&y_, i);
|
bigint_shiftright_bits(&y_, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
u.wordv = u_b;
|
u.wordv = u_w;
|
||||||
v.wordv = v_b;
|
v.wordv = v_w;
|
||||||
a_.wordv = a_b;
|
a_.wordv = a_w;
|
||||||
b_.wordv = b_b;
|
b_.wordv = b_w;
|
||||||
c_.wordv = c_b;
|
c_.wordv = c_w;
|
||||||
d_.wordv = d_b;
|
d_.wordv = d_w;
|
||||||
|
|
||||||
bigint_copy(&u, &x_);
|
bigint_copy(&u, &x_);
|
||||||
bigint_copy(&v, &y_);
|
bigint_copy(&v, &y_);
|
||||||
|
@ -1017,7 +1032,6 @@ void bigint_mul_word_u(bigint_t *a, bigint_word_t b){
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
#if 1
|
|
||||||
|
|
||||||
void bigint_clip(bigint_t *dest, bigint_length_t length_W){
|
void bigint_clip(bigint_t *dest, bigint_length_t length_W){
|
||||||
if(dest->length_W > length_W){
|
if(dest->length_W > length_W){
|
||||||
|
@ -1025,8 +1039,8 @@ void bigint_clip(bigint_t *dest, bigint_length_t length_W){
|
||||||
}
|
}
|
||||||
bigint_adjust(dest);
|
bigint_adjust(dest);
|
||||||
}
|
}
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
/*
|
/*
|
||||||
* m_ = m * m'[0]
|
* m_ = m * m'[0]
|
||||||
* dest = (a * b) % m (?)
|
* dest = (a * b) % m (?)
|
||||||
|
@ -1242,8 +1256,6 @@ void bigint_expmod_u_mont_sam(bigint_t *dest, const bigint_t *a, const bigint_t
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void bigint_expmod_u(bigint_t *dest, const bigint_t *a, const bigint_t *exp, const bigint_t *r){
|
void bigint_expmod_u(bigint_t *dest, const bigint_t *a, const bigint_t *exp, const bigint_t *r){
|
||||||
#if 0
|
#if 0
|
||||||
printf("\nDBG: expmod_u (a ** e %% m) <%s %s %d>\n\ta: ", __FILE__, __func__, __LINE__);
|
printf("\nDBG: expmod_u (a ** e %% m) <%s %s %d>\n\ta: ", __FILE__, __func__, __LINE__);
|
||||||
|
|
Loading…
Reference in New Issue