IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
1

ГОСТ 3410 / Работа с длинными числами

01.10.2008, 12:20. Показов 17701. Ответов 75
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Начал делать курсовик по реализации ЭЦП по ГОСТ 34.10 (и соответственно 34.11 и 28147 ). В качестве среды разработки выбрал C++ Builder.
Возник вопрос: Как работать с большими числами размером в 256,512,1024 бит? Они, ведь, ни в один тип данных не лезут (int только 32 бита). В контрольком примере дано число 57896044618658097711785492504343953926634992332820282019728792003956564821041.
P.S Чужая реализация 3410-01 Но, есть сильное подозрение а то, что препода "кинули" - подсунили ему в место ГОСТ 3410-2001, забугорский ECDSA.
Мой курсовик:
Недостатки:
1) Результат проверки не совпадает с генерированой подписью. Проблема в математике.
2) Нет создания хэша функции по ГОСТ 3411
3) Нет вычисленя параметров ЭК.
4) Длительное время работы (прога не зависла - она считает)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2008, 12:20
Ответы с готовыми решениями:

Работа с длинными числами
Не работает программа с длинными числами...подскажите как поправить (3ab-4c) / d^2 .model small...

Работа с длинными числами
Мне нужно прочитать из файла 22-х значные целые числа для количественного сравнения. int и long int...

Работа с длинными числами
Здравствуйте! На программировании в вузе дали индивидуальную задачу которая предусматривает...

Работа с длинными числами (Delphi 7)
подскажите как написать программу в делфи 7 длинные числа(произведение)!плз!!

75
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
01.10.2008, 13:23 2
есть арифметика длинных чисел, почитай С. Оклов "Программирование в алгоритмах"
0
IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
06.10.2008, 18:11  [ТС] 3
А нельзя просто выделить память под переменную в 256 бит?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
06.10.2008, 18:14 4
ну так в один бит ты как цифру записать собрался? глянь типы данных, там по-любому есть тип, который в себя вместит число, просто с помощью арифметики длинных числе можно реализовать быстрые алгоритмы для работы с такими числами
0
IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
20.10.2008, 10:30  [ТС] 5
Нашел материал по работе с длинными числами - Щербаков, Домашев Прикладная криптография. Но, к сожалению не могу заставить работать хотя бы первый алгоритм сложения - не выполняется перенос разряда. В чем проблема?
http://slil.ru/26253252 - все о госте
http://slil.ru/26253265 - не работающая прога
http://slil.ru/26253351 - Щербаков, Домашев Прикладная криптография
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.10.2008, 10:41 6
сложение длинных чисел
Код
void add(int a[N], int b[N], int c[N]){
  memset(c, 0, sizeof(int)*N);
  int i = 0;
  for(i = N - 1; i >= 0; i--){
    if(t.quot){
      c[i]++;
      if(i < ctrl) ctrl = i;
    }
    t = div((c[i] + a[i] + b[i]),10);
    c[i] = t.rem;
  }
}
0
IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
20.10.2008, 19:32  [ТС] 7
Объясните этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1_math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
#define LoDigit(T) ((int)(T))
#define HiDigit(T) ((int)((T)>>m))
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void Assign (int A[], const int B[], int n);// A:=B
 
void AssignDigit( int A[],  int x, int n );// A:=число x
 
void Zero (int A[], int n);// A=0
 
int IsZero (int A[], int n);// равно ли A=0?
 
int Add (int C[], const int A[], const B[], int n)// сложение длинных чисел длиной n цифр
{
__int64 T; число длиною равной сумме длины числа A и числа B
int d=0;// перенос разряда
int i;
char m=32; //почему char 
 
for (i=0; i<=n; i++)
        {
        T=(__int64)A[i]+B[i]+d;//(__int64) - что значит
        C[i]=LoDigit (T);// младшие разряды числа T - как работает?
        d=HiDigit(T);// старшие разряды числа T - как работает?
        }
for (i=0; i<=n; i++) Form1->LabeledEdit1->Text=Form1->LabeledEdit1->Text+IntToStr(A[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit2->Text=Form1->LabeledEdit2->Text+IntToStr(B[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit3->Text=Form1->LabeledEdit3->Text+IntToStr(C[i]);
return d;
};
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
int a[]={2,2,9}, b[]={1,2,9,1},c[]={1,2,2,3};
Add(c,a,b,3);// вызов
 
}
//---------------------------------------------------------------------------
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.10.2008, 20:21 8
(__int64) - это приведение типа, LoDigit(T) - возвращает младшие 4 байта
HiDigit(T) - старшие 4 байта, чар используется для того, чтобы был один байт...
ну а вообще - алгоритм прост... иммитация сложения столбцом... только человек эффективнее использует элементы массива, в отличии от моего алгоритма... да и по-хорошему, ты бы мог и потрассировать алгоритм, тогда будет видно, что там и зачем делается
1
IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
20.10.2008, 20:35  [ТС] 9
1) Спасибо
2) Как работает #define HiDigit(T) ((int)((T)>>m))? Сам понял, что число T помещается в поток, а ((int)((T)>>m)) что делает? За счет, чего помещается в старшие 4 байта.
3) Почему при сложении int a[]={2,2,9} и b[]={1,2,9} получается С[i]={3,4,18} т.е нет переноса.
4) Трассировку хорошо бы сделать, но не ясно как. В меню Run можно выполнить только команду Run, а по шагам нельзя.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.10.2008, 21:31 10
>> - это в данном случае сдвиг на 32 бита
ну так при выводе будет 1843... а переполнение - это когда число больше байта будет по идее...
0
IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
20.10.2008, 22:34  [ТС] 11
Unit1_math.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1_math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
#define LoDigit(T) ((int)(T))
#define HiDigit(T) ((int)((T)>>m))
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void Assign (int A[], const int B[], int n);
 
void AssignDigit( int A[],  int x, int n );
 
void Zero (int A[], int n);
 
int IsZero (int A[], int n);
 
int Add (int C[], const int A[], const B[], int n)
{
__int64 T;
int d=0;
int i;
char m=32;
 
Form1->RichEdit1->Lines->Add(sizeof (T));
for (i=0; i<=n; i++)
        {
        T=(__int64)A[i]+B[i]+d;
        C[i]=LoDigit (T);
        d=HiDigit(T);
        Form1->RichEdit1->Lines->Add("i="+IntToStr(i)+" T="+IntToStr(T)+" C="+IntToStr(C[i])+" sizeof(C)="+IntToStr(sizeof(C[i]))+" d="+IntToStr(d)+ " sizeof(d)="+IntToStr(sizeof(HiDigit(T))));
        }
for (i=0; i<=n; i++) Form1->LabeledEdit1->Text=Form1->LabeledEdit1->Text+IntToStr(A[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit2->Text=Form1->LabeledEdit2->Text+IntToStr(B[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit3->Text=Form1->LabeledEdit3->Text+IntToStr(C[i])+";";
return d;
};
 
int Sub (int C[], const int A[], const B[], int n)
{
__int64 T;
int d=0;
int i;
char m=32;
 
Form1->RichEdit1->Lines->Add(sizeof (T));
for (i=0; i<=n; i++)
        {
        T=(__int64)A[i]-B[i]-d;
        C[i]=LoDigit (T);
        d=HiDigit(T);
        d=(0-d);
        Form1->RichEdit1->Lines->Add("i="+IntToStr(i)+" T="+IntToStr(T)+" C="+IntToStr(C[i])+" sizeof(C)="+IntToStr(sizeof(C[i]))+" d="+IntToStr(d)+ " sizeof(d)="+IntToStr(sizeof(HiDigit(T))));
        }
for (i=0; i<=n; i++) Form1->LabeledEdit1->Text=Form1->LabeledEdit1->Text+IntToStr(A[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit2->Text=Form1->LabeledEdit2->Text+IntToStr(B[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit3->Text=Form1->LabeledEdit3->Text+IntToStr(C[i])+";";
return d;
};
 
int Cmp (const int A[], const B[], int n)
{
int i;
char m=32;
 
for (i=n-1; (i>=n)&&(A[i]==B[i]); i--);
if (i<0) return 0;
if (A[i]>B[i]) return +1;
return -1;
};
 
void Mul (int C[], const int A[], const B[], int n)
{
int i,j;
int d;
__int64 T;
 
Zero(C,n);
 
for (i=0; i<=n; i++)
{
        d=0;
        for (j=0; j<n; j++)
        {
                T = (__int64)A[i]*B[j]+d;
                C[i+j]=LoDigit (T);
                d= HiDigit (T);
        }
        C[i+j]=d;
}
for (i=0; i<=n; i++) Form1->LabeledEdit1->Text=Form1->LabeledEdit1->Text+IntToStr(A[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit2->Text=Form1->LabeledEdit2->Text+IntToStr(B[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit3->Text=Form1->LabeledEdit3->Text+IntToStr(C[i])+";";
}
 
void ClearAllForm()
{
Form1->RichEdit1->Clear();
Form1->LabeledEdit1->Clear();
Form1->LabeledEdit2->Clear();
Form1->LabeledEdit3->Clear();
Form1->LabeledEdit4->Clear();
}
//------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ClearAllForm();
int a[]={2,2,9}, b[]={1,2,9},c[]={1,2,2,3};
Form1->LabeledEdit4->Text=IntToStr(Add(c,a,b,2));
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ClearAllForm();
int a[]={2,2,8}, b[]={1,2,9},c[]={1,2,2,3};
Form1->LabeledEdit4->Text=IntToStr(Sub(c,a,b,2));
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ClearAllForm();
int a[]={2,2,9}, b[]={1,2,9};
Form1->LabeledEdit4->Text=IntToStr(Cmp(a,b,2));
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Label1->Caption="Длина машинного слова m="+IntToStr(m)+" Количество цифр n=" + IntToStr(n);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button4Click(TObject *Sender)
{
int a[]={2,2,9}, b[]={1,2,9},c[]={1,2,3,4,5,6,7,8,9};
Mul (c,a,b,n);
}
//---------------------------------------------------------------------------
Unit1_math.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//---------------------------------------------------------------------------
 
#ifndef Unit1_mathH
#define Unit1_mathH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TLabeledEdit *LabeledEdit1;
        TLabeledEdit *LabeledEdit2;
        TLabeledEdit *LabeledEdit3;
        TButton *Button1;
        TRichEdit *RichEdit1;
        TButton *Button2;
        TButton *Button3;
        TLabeledEdit *LabeledEdit4;
        TLabel *Label1;
        TButton *Button4;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
 
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
int Mas[]={1,2,3,4,5,6,7,8,9,};
int n=2;
char m=32;
 
void Assign (int A[], const int B[], int n);
 
void AssignDigit( int A[],  int x, int n );
 
void Zero (int A[], int n);
 
int IsZero (int A[], int n);
 
int Add (int C[], const int A[], const B[], int n);
 
int Sub (int C[], const int A[], const B[], int n);
 
int Cmp (const int A[], const B[], int n);
 
void Mul (int C[], const int A[], const B[], int n);
 
//---------------------------------------------------------------------------
#endif
Выдает ошибку:
[Linker Error] Unresolved external 'Zero(int *, int)' referenced from D:\PROGRAM FILES\BORLAND\CBUILDER6\BIN\3410_ARIFMETIKA\UNIT1_MATH.OBJ
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
21.10.2008, 10:45 12
прототип Zero описан, даже есть вызов функции, ну а где же ее реализация-то?
0
IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
21.10.2008, 12:41  [ТС] 13
Возникли еще вопросы. Как работают функции, ведь в них есть только передача параметров:
C++
1
2
3
4
void Assign (int A[], const int B[], int n); // A=B
void AssignDigit( int A[],  int x, int n );// A=x, x - число
void Zero (int A[], int n);// A=0, A -число длиною в n цифр
int IsZero (int A[], int n);//равно ли нулю?
Или это стандартные функции C++?

Добавлено через 3 минуты 7 секунд
Второй вопрос.
Unit1_math.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
//---------------------------------------------------------------------------
 
#ifndef Unit1_mathH
#define Unit1_mathH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TLabeledEdit *LabeledEdit1;
        TLabeledEdit *LabeledEdit2;
        TLabeledEdit *LabeledEdit3;
        TButton *Button1;
        TRichEdit *RichEdit1;
        TButton *Button2;
        TButton *Button3;
        TLabeledEdit *LabeledEdit4;
        TLabel *Label1;
        TButton *Button4;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
int Mas[]={1,2,3,4,5,6,7,8,9,};
int n=2;
char m=32;
 
void Assign (int A[], const int B[], int n);
 
void AssignDigit( int A[],  int x, int n );
 
void Zero (int A[], int n);
 
int IsZero (int A[], int n);
 
int Add (int C[], const int A[], const B[], int n);
 
int Sub (int C[], const int A[], const B[], int n);
 
int Cmp (const int A[], const B[], int n);
 
void Mul (int C[], const int A[], const B[], int n);
 
//---------------------------------------------------------------------------
#endif[/CODE]
 
[CODE]//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1_math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
#define LoDigit(T) ((int)(T))
#define HiDigit(T) ((int)((T)>>m))
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void Assign (int A[], const int B[], int n);
 
void AssignDigit( int A[],  int x, int n );
 
void Zero (int A[], int n);
 
int IsZero (int A[], int n);
 
int Add (int C[], const int A[], const B[], int n)
{
__int64 T;
int d=0;
int i;
char m=32;
 
Form1->RichEdit1->Lines->Add(sizeof (T));
for (i=0; i<=n; i++)
        {
        T=(__int64)A[i]+B[i]+d;
        C[i]=LoDigit (T);
        d=HiDigit(T);
        Form1->RichEdit1->Lines->Add("i="+IntToStr(i)+" T="+IntToStr(T)+" C="+IntToStr(C[i])+" sizeof(C)="+IntToStr(sizeof(C[i]))+" d="+IntToStr(d)+ " sizeof(d)="+IntToStr(sizeof(HiDigit(T))));
        }
for (i=0; i<=n; i++) Form1->LabeledEdit1->Text=Form1->LabeledEdit1->Text+IntToStr(A[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit2->Text=Form1->LabeledEdit2->Text+IntToStr(B[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit3->Text=Form1->LabeledEdit3->Text+IntToStr(C[i])+";";
return d;
};
 
int Sub (int C[], const int A[], const B[], int n)
{
__int64 T;
int d=0;
int i;
char m=32;
 
Form1->RichEdit1->Lines->Add(sizeof (T));
for (i=0; i<=n; i++)
        {
        T=(__int64)A[i]-B[i]-d;
        C[i]=LoDigit (T);
        d=HiDigit(T);
        d=(0-d);
        Form1->RichEdit1->Lines->Add("i="+IntToStr(i)+" T="+IntToStr(T)+" C="+IntToStr(C[i])+" sizeof(C)="+IntToStr(sizeof(C[i]))+" d="+IntToStr(d)+ " sizeof(d)="+IntToStr(sizeof(HiDigit(T))));
        }
for (i=0; i<=n; i++) Form1->LabeledEdit1->Text=Form1->LabeledEdit1->Text+IntToStr(A[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit2->Text=Form1->LabeledEdit2->Text+IntToStr(B[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit3->Text=Form1->LabeledEdit3->Text+IntToStr(C[i])+";";
return d;
};
 
int Cmp (const int A[], const B[], int n)
{
int i;
char m=32;
 
for (i=n-1; (i>=n)&&(A[i]==B[i]); i--);
if (i<0) return 0;
if (A[i]>B[i]) return +1;
return -1;
};
 
void Mul (int C[], const int A[], const B[], int n)
{
int i,j;
int d;
__int64 T;
 
Zero(C,n);
 
for (i=0; i<=n; i++)
{
        d=0;
        for (j=0; j<n; j++)
        {
                T = (__int64)A[i]*B[j]+d;
                C[i+j]=LoDigit (T);
                d= HiDigit (T);
        }
        C[i+j]=d;
}
for (i=0; i<=n; i++) Form1->LabeledEdit1->Text=Form1->LabeledEdit1->Text+IntToStr(A[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit2->Text=Form1->LabeledEdit2->Text+IntToStr(B[i]);
for (i=0; i<=n; i++) Form1->LabeledEdit3->Text=Form1->LabeledEdit3->Text+IntToStr(C[i])+";";
}
 
void ClearAllForm()
{
Form1->RichEdit1->Clear();
Form1->LabeledEdit1->Clear();
Form1->LabeledEdit2->Clear();
Form1->LabeledEdit3->Clear();
Form1->LabeledEdit4->Clear();
}
//------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ClearAllForm();
int a[]={2,2,9}, b[]={1,2,9},c[]={1,2,2,3};
Form1->LabeledEdit4->Text=IntToStr(Add(c,a,b,2));
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ClearAllForm();
int a[]={2,2,8}, b[]={1,2,9},c[]={1,2,2,3};
Form1->LabeledEdit4->Text=IntToStr(Sub(c,a,b,2));
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ClearAllForm();
int a[]={2,2,9}, b[]={1,2,9};
Form1->LabeledEdit4->Text=IntToStr(Cmp(a,b,2));
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Label1->Caption="Длина машинного слова m="+IntToStr(m)+" Количество цифр n=" + IntToStr(n);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button4Click(TObject *Sender)
{
int a[]={2,2,9}, b[]={1,2,9},c[]={1,2,3,4,5,6,7,8,9};
Mul (c,a,b,n);
}
//---------------------------------------------------------------------------
Выдает ошибку: [Linker Error] Unresolved external 'Zero(int *, int)' referenced from D:\PROGRAM FILES\BORLAND\CBUILDER6\BIN\3410_ARIFMETIKA\UNIT1_MATH.OBJ
Как понял, проблемы с областью видимости функции zero. Что надо исправить?
0
1 / 1 / 0
Регистрация: 21.10.2008
Сообщений: 25
21.10.2008, 12:43 14
Я возможно не по теме, но все же. У меня аналогичный курсовик (Реализация ГОСТ 34.10-94).
Вопрос к IS, у тебя есть нормальный вариант этого ГОСТа? Просто все что я находил в интернете содержит ошибки, да и из текста становится понятно, что некоторые операции написаны неверно.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
21.10.2008, 12:57 15
*bkmz, вот бери его исходник и подгоняй под себя, а то на все готовенькое попасть - это же жутко скучно... а покой нам только снится

IS, где реализация функции zero? я что-то так и не нашел в твоем листинге...
0
IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
21.10.2008, 12:59  [ТС] 16
*bkmz, Свой гост брал на http://protect.gost.ru/, но сейчас что-то глючит.
реализация описана http://slil.ru/26253351 - Щербаков, Домашев Прикладная криптография. Но, как видешь, пока не могу заставить работать арифметические операции. Может у тебя получится. Если заработает, то сообщи.
0
1 / 1 / 0
Регистрация: 21.10.2008
Сообщений: 25
21.10.2008, 13:19 17
Цитата Сообщение от WooDooMan Посмотреть сообщение
*bkmz, вот бери его исходник и подгоняй под себя, а то на все готовенькое попасть - это же жутко скучно... а покой нам только снится
Возможно был неправильно вопрос мой понят, мне не нужны исходники, а нужен нормальный текст ГОСТа. Что касается исходников, то я пишу все сам.

Свой гост брал на http://protect.gost.ru/, но сейчас что-то глючит.
Не получилось щас найти там 34.10. Наверно глючит... Буду искать.

Но, как видешь, пока не могу заставить работать арифметические операции. Может у тебя получится. Если заработает, то сообщи.
Я к счастью лишен этой проблемы благодаря замечательному (IMHO) классу java.math.BigInteger
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
21.10.2008, 13:28 18
IS, блин, да что там непонятно, у тебя нет реализации функции зеро, просто ее прототип и вызов в теле программы... напиши реализацию этой функции и будет тебе счастье

*bkmz, просто тут слишком часто просят именно сырцы... вот и поэтому я так тебе ответил, ничего личного...
0
IS
13 / 13 / 2
Регистрация: 01.10.2008
Сообщений: 116
21.10.2008, 14:52  [ТС] 19
WooDooMan, Извиняюсь, просто не заметил, что появилась вторая страница и я решил, что сообщение не отправилось.
Теперь к делу. Действительно, нет реализации - у авторов эта функция так и приводится без реализации, не ясно за чем. Реализацию добавил.
C++
1
2
3
4
void Zero (int A[], int n)
{
for (int i=0; i<n; i++) A[i]=0;
};
С остальными разберусь.
Вопросы:
1) Что должен делать макрос #define MaxDigit ((int)(-1));?
2) Как определить количество элементов в массиве?
0
1 / 1 / 0
Регистрация: 21.10.2008
Сообщений: 25
21.10.2008, 15:08 20
WooDooMan, да ничего страшного, понимаю..
0
21.10.2008, 15:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2008, 15:08
Помогаю со студенческими работами здесь

Функция с++ (работа с длинными числами - вывод результата в файл)
У меня есть проэкт с++ который использует динамическую библиотеку для работы с длинными числами. В...

Действия с длинными числами
Ребята, нужна помощь. Информации нигде нет. Задача такова. Нужно провести арифметичексие действия с...

Сочетания с длинными числами
Нужно создать программу, которая вычисляла бы количество комбинаций для сочетания без повторения....

Операции с длинными числами
Друзья! Помогите пожалуйста. Мне надо составить программу, которая будет вычислять (сложить,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru