Специфика использования библиотеки mmath на примере проверки простоты больших чисел, страница 2

s

m

n

lsv

msw

msw

                                                                                                                                   X[n+m]

s - знаковый бит

n – длина числителя, целого числа

m – длина знаменателя

0=232 – max

функция выделения памяти

miracl * mirsys(int len, int Base);

                  base – основание системы счисления

Если len=10 а base=16, то выделяется 10*16 бит

Return: указатель типа (miracl *)

функция освобождения памяти

void mirexit();

функция выделения памяти под переменную типа big или flash

flash mirvar (int IV)

IV – записывает в созданную big, flash

процедура высвобождения памяти из-под переменной

mirkill(big x) void

Пример

Extern “c”{

#include “miracl.h”

}

miracl *mip=mirsys(100,0);

big n1, n2, flash 3;

n1=mirvar(1);

n2=mirvar(2);

…………….

mirkill(n1);

mirkill n2);

mirexit();

Функции:

1.  ввода-вывода;

2.  преобразования типов

3.  генерация n случайных чисел

4.  арифметические и логические операции низкого уровня

int innum(flash x, file*f);

int instr(flash x, char*str);

int cinstr(flash x, char*str);

2≤(mip->iobase)=256;

 big x=mirvar(1);

instr (x, “fffff….”);

int otnum(flash x, file*f);

int cotnum(flash x, file*f);

int otstr (flash x, char*str);

int cotstr (flash x, char*str);

void bytes_to_big (int len, char * bytes, big x);

void big_to_bytes(int max, big x, char *bytes);

void convert(int n, big x);

void lpconv(long n, big x);

int compare(big x, big y)

-1: x<y

1: x>y

0:x=0;

int getdipit(big x, int i);

void putdip(int n, big x, int i);

определение количества цифр в числе

int numdig  (big x),

функции копирования

void copy(flash x, flash y);

void zero(flash x);

функция изменения макс. числа

определение знака

int exsiqh(flash x)//±1

void insiqh(int s, flash x);

void irand(long seed);

int brand();

int brand(big max, big x);

1<x<max

void strong_init(int len_seed, char *seed, long tod);

void strong_rng(int len_byte, char *x);

void strog_bigrand(big max, big x)

1<x<max


ЛЕКЦИЯ 5. 7.03

Изучение вариантов реализации редукции для целых чисел (классический метод, метод Баретта)

Классический метод

Xk (mod P)

t+1

 
                                                                                                                                                                                                                                                                                

b=(2wn=32)

y*d

x*d                  d-коэффициент

d=2k

 

 

Метод Баретта

   

                

         

1.                    

2.        (=r1-r2)

3. if

4. while       // max 2 page

Численный пример

b=4 (любое b>3)

m=(233)4=(47)10; k=3

x=(313221)4         

1.1.

1.2. (3132)4*(1113)4=(10231302)4

1.3.      (при делении сдвиг вправо на k+1)

2.1. (313221)4mod44=(3221)4ri

2.2. (1023)4*(233)4mod44=(313011)4mod44=(3011)4

2.3. (3221)4-(3011)4=(210)4=(36)10

I=(k2+5k+2)/2

k – разрядность модуля. Оценка сложности

264+232                      01100000
ЛЕКЦИЯ №6. 9.03

Простейшие методы и алгоритмы возведения в степень: бинарный и блочный метод.

Метод возведения в степень справа налево

xR mod P, R=2310=    M-умножение, S-возведение в квадрат

Алгоритм

M=1; S=x

for (i0, i<t, i++)

{ if (Ri==1)

M=(M*S) mod P

S=(S*S) mod P }

Пример

R=2310     x – число большой разрядности

M

1

x

x3

x7

-

x23

R

(10111)

1011

101

10

1

0

S

x

I+wt(R)

Метод возведение в степень слева направо

Старший бит 1 – отбрасывается, если 0 – возводим в квадрат, если 1 – возв. в квадрат и умножаем

 
 


  1

 
2310=                            

Алгоритм:

M=x

for (i=t-2, i>=0, i--)

{ M=M2 mod P

   if (Ri==1) M=(M*x) mod P }

i

-

3

2

1

0

Ri

-

0

1

1

1

M

x

x2

x4

x5

x10

x11

x22

x23

I+wt(R)-1

Блочный метод (метод окна)

Алгоритм:

X[0]=1; X[1]=x

For(i=1; i<=2R-1; i++)

X[i]=X[i-1]*x

M=1;

For (i=t-1; i>=0; i--)

{M=M2R mod P

M=M*X[ni] mod P}

I+IM*IS

 

Пример

n=2310==(n1*n0)=(27)8          R=3  (Перевод в 8-ричную систему счисления)

i

-

1

0

ni

-

2

7

M

1

1*x2

(x2)8=x16; x16*X[7]=x23

Модифицированный блочный метод

X[0]=1; X[1]=x; X[2]=x2

For(i=1; i<=2R-1; i++)

X[2i+1]=X[2i-1]*X[2];

M=1;

For (i=t-1; i>=0; i--)

{}

Метод скользящего окна

//Предвычисления (см. метод. выше)

                                    (nt+1….. n2 n1 n0)2

M=1; i=t-1;

While (i>=0)

{ if (ni==0) {M=M2 mod P;

         i--;} else{ nini-1nl) //выделение подстроки, так, что

i-l+1<=R и nl=1

;

i=l-1; }

}