|
||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ������������������� ![]() ����������� � �������������� ![]() �������� ���������� ![]() ![]() ![]() ![]() ����: �������� PS � PDF ������ ![]() �������� ���-������� �������� ������� ����� |
����������: ������ �����: ������� ����������.![]() ![]() ![]() ��������� - ���������� �������� �������� ����������� ������� � (!) ��������� �������-��������� ������ � ���. fft.cfft.h bigint.h bigint.c 1. ������������� ������� �����.������ ������������� ������� �� ����� �����. ������, ������� ����� N �������������� � ����
B - ��������� ������� ���������, � ������� ������������ �����. ��� xi - ����������� ����� /long ��� double, ��������/ � 0 <= xi < B ��� ������ ������� ����� ������ ������ �����, ������ �������� e - ����� �������, � ����������� �� ������� �� ������ �� ������ ���� '�������' � ������� ����� y, ������ ��������� ��������. ���� ����� ���� �������� ��������, ���� ��� xi < 0. ��������� B ������ ������� �� ������������� ������� �������� ���� ������ �� ����������, � ����������, ������ �� ��������� �����������:
��� ������������� xi ����������� ������� ��� long (� C�). ������, long ������ �������� 32 ����, � ������������� double (�� - ������ 53 ����) ���� ����������� �������� ������� ���������. ����� ����, ��������� ���������� ( ����. pentium ) ���������� �������������� ��� �������� � ��������� ������, ������� ����� �������� double. typedef double Real; typedef struct BigIntTag { Real * Coef; long Size, SizeMax; } BigInt; #define BASE 10000. #define invBASE 0.0001 // B-1 #define NBDEC_BASE 4 // ����� ������ � B 2. �������� ��������.2.1 �������������� � ������������� ���� ������� �� ��������������� �������������
������� � i = 0, ����� � �������� xi �� B � ������������ ������� �� xi+1. void UpdateBigInt(BigInt * A) { long i; Real carry=0., x; for (i=0; i<A->Size; i++) { x = A->Coef[i] + carry; carry = floor(x*invBASE); A->Coef[i] = x-carry*BASE; } if (carry!=0) { while (carry!=0.) { x = carry; carry = floor(x*invBASE); A->Coef[i] = x-carry*BASE; i++; A->Size=i; } if (A->Size > A->SizeMax) { printf("Error in UpdateBigInt, Size > SizeMax\n"); } } else { while (i>0 && A->Coef[i-1]==0.) i--; A->Size=i; } } 2.2 ����� � ��������.C��������� ������������ � ������������ �������������� � ������������� ���� ��� ��������, ���������� - ��������. /* * C = A + B */ void AddBigInt(BigInt * A, BigInt * B, BigInt * C) { long i; if (A->Size < B->Size) { AddBigInt(B,A,C); return; } /* We now have B->Size < A->Size */ for (i=0; i < B->Size; i++) C->Coef[i] = A->Coef[i] + B->Coef[i]; for (; i < A->Size; i++) C->Coef[i] = A->Coef[i]; C->Size = A->Size; UpdateBigInt(C); } 2.3 ��������� �� ����� �����.����� q - ����� �����, ��� qB �������� ��� ��� ������ �������������. ����� ������������ x �� q ��������, ������� ������ xi �� q � ����������� ������� � i = 0 � �����. 2.4 ������� �� ����� �����.������� � i = n, ����� ������ xi �� q � ������������ �������, ���������� �� B � xi-1 � ��� �����. 2.5 ������� ������������ ���� ������� �����.����� ���� 2 ������� ����� � ������������ �����: ![]() ![]() ������� ����� Z = X*Y ����� ���� ��������� �� �������: ![]() ![]() ����� ������.
����� ������������� ������� �����, ������� ��� ����������������. �����������, ��� ������������: ���������� ��� ������� �����, ����� �����, ����������� ��� ��������. |