• No se han encontrado resultados

0 , en cualquier otro caso.

6.2. IMPLEMENTACIÓN DEL ALGORITMO CFRAC.

6.2.3. Inicializar las estructuras de almacenamiento de relaciones.

El tercer paso para el proceso de factorización es reservar la memoria necesaria para el almacenamiento de las relaciones.

Para el mejor manejo de los valores a calcular, procesar y, en su caso, almacenar, hemos definido las dos siguientes estructuras:

typedef struct { UINT2** M_Rel; NUMERO* V_Pi; NUMERO* V_Ci; NUMERO* V_Fact; UINT2** M_Id; UINT4 *ind; UINT2 *validez; }RELACIONES; typedef struct { UINT2* Rel; NUMERO Pi; NUMERO Ci; NUMERO Factor; }REL;

Diseño e implementación del algoritmo de factorización por fracciones continuas 166 las relaciones que sean válidas: tanto las suaves como las de factor grande menor que el límite superior. Los campos que contiene son:

⇒ Un puntero doble de tipo UINT2, llamado M_Rel, para la matriz de vectores

e

i que contienen

la información sobre la factorización de cada uno de los valores

C

i guardados. Los sucesivos

vectores de exponentes

e

i almacenan un 1 o un 0 en columnas de bits. Cada 16 primos de la

base de factores forman una columna de elementos UINT2 del vector. Reservaremos tantos elementos UINT2 para cada vector como sean necesarios para “enfilar” tantos bits como indique el cardinal de la base de factores. La matriz tendrá tantas filas como indique la suma de relaciones normales más la suma de relaciones de factor grande a buscar. Como veremos en el Capítulo 7, finalmente esta matriz quedará formada con elementos de tipo UINT4, enteros de 32 bits.

⇒ Un puntero de tipo NUMERO, para el vector que deberá almacenar los sucesivos valores de

P

i

de cada nueva relación. Tendremos tantos elementos en el vector como filas tiene la matriz de relaciones.

⇒ Un puntero de tipo NUMERO, para el vector que deberá almacenar los sucesivos valores de

C

i

de cada nueva relación. Tendremos tantos elementos en el vector como filas tiene la matriz de relaciones.

⇒ Un puntero de tipo NUMERO, para el vector que deberá almacenar los sucesivos valores de los sucesivos factores grandes (

R

i) después de haber dividido

C

i por todos sus divisores

contenidos en la base de factores. Tendremos tantos elementos en el vector como filas tiene la matriz de relaciones.

⇒ Un puntero doble de tipo UINT2 para la matriz histórica que será una matriz con tantas columnas UINT2 como sean necesarias para tener “enfilados” tantos bits como filas tenga la matriz de relaciones y tendrá tantas filas como filas tenga la matriz de relaciones. Es una matriz cuadrada y al principio debe ser inicializada como matriz identidad. Esta matriz histórica es la que, al final de todo el proceso descrito en la introducción de este Capítulo, determinará los distintos conjuntos

S

de que disponemos. Del mismo modo que ocurre con la matriz de relaciones, como veremos en el siguiente Capítulo, este puntero quedará finalmente del tipo UINT4.

⇒ Un puntero de tipo UINT4 que direccionará un vector que será un índice para la ordenación de las relaciones en los procesos de búsqueda de factores grandes iguales y en la eliminación gaussiana. Tendremos tantos elementos en el vector como filas tiene la matriz de relaciones.

⇒ Un puntero de tipo UINT2 para el vector que deberá indicar la validez de cada una de las relaciones almacenadas. Tendremos tantos elementos en el vector como filas tiene la matriz de relaciones. Para cada relación, el valor correspondiente a la posición del vector será cero si no almacena relación alguna, o si ha sido invalidada en el proceso de eliminación gaussiana,

Diseño e implementación del algoritmo de factorización por fracciones continuas 167 o si corresponde a una relación de factor grande mayor que 1 y que ha sido utilizada para validar otras relaciones con el mismo factor grande; será uno si la relación que almacena corresponde a una con un valor

C

i completamente factorizado en la base de factores (es

decir: cuyo factor grande es igual a 1), o si la relación tiene un factor grande diferente de uno pero ha sido validada por suma módulo 2 con otra que tiene el mismo factor grande; y valdrá dos si la relación que almacena es de factor grande (

R

i mayor que uno y menor que el límite

superior) y no ha sido validada al haber hallado otra relación con el mismo factor grande. La segunda estructura (REL) ha sido creada para el manejo de una sola relación. Es la variable que empleamos para asignar un nuevo valor de par

PC

y la que recoge los valores ceros y unos del vector de exponentes

e

i y el factor grande. Sus campos son:

⇒ Un puntero de tipo UINT2 que direcciona un vector con tantos elementos UINT2 como sean necesarios para alinear tantos bits como sea el cardinal de la base de factores más uno. Será el encargado de almacenar el vector de exponentes

e

i correspondiente al valor

C

i que se

esté en ese momento intentando factorizar. Después de los procesos de optimización presentados en el Capítulo 7, quedará del tipo puntero a UINT4.

⇒ Dos variables de tipo NUMERO para almacenar los valores de

P

i y de

C

i.

⇒ Una variable de tipo NUMERO para almacenar el valor del factor grande

R

i.

Como puede verse, los cuatro campos de la estructura REL tienen el formato de una fila de la estructura RELACIONES: el vector Rel es una fila de la matriz M_Rel; las variables Pi, Ci y Factor son elementos del vector V_Pi, V_Ci y V_Fact respectivamente. Los otros tres campos de la estructura RELACIONES están definidos para el seguimiento de los procesos necesarios para la eliminación de factores grandes y para el proceso de eliminación gaussiana.

Cuando se crea una variable de tipo RELACIONES o de tipo REL queda pendiente el trabajo de reservar todos los espacios de memoria de todas las matrices y de todos los vectores que serán direccionados por los punteros. No es una tarea trivial, y depende en cada caso de los valores del cardinal de la base de factores y del número de relaciones a buscar. Han quedado definidas dos funciones que reciben como parámetros la variable de tipo PARAMETRO del proceso de factorización y la variable de tipo RELACIONES o REL que se quiere inicializar:

void InicializarRelaciones(RELACIONES*,PARAMETROS); void InicializarRel(REL*,PARAMETROS);

Estas funciones crean los espacios de memoria necesarios para cada vector de enteros, de variables tipo NUMERO o para las matrices de relaciones e histórica. Y asignan a cada espacio reservado los valores iniciales cero.

La reserva de memoria para todos los campos de las estructuras se realiza mediante la función malloc(). La memoria que se debe reservar para cualquier proceso de factorización es grande,

Outline

Documento similar