Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708

Алгебраические операции в конечном поле

26.10.2020, 22:48. Показов 1431. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак решил разобраться с алгебраическими операциями в конечном поле. Худо бедно, но получилось)) Правда возник один вопрос, как привести матрицу к ступенчатому виду над полем. Операцию деления я заменил на умножение на обратный элемент. И собственно, вроде сделал правильно, НО получается что конечная матрица у меня дублирует строки и не приводит к ступенчатому виду....

Кликните здесь для просмотра всего текста

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
#define uint8_t u8
#define FIELD_POLY 0x07
#define HIGH_BIT_ON_FIELD 0x02
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <memory>
#include <random>
 
using namespace std;
u8 gf_add(u8 a, u8 b)
{
    return a ^ b;
}
u8 multiply_gf(u8 a, u8 b)
{
    u8 acc = 0x00;
    u8 msb = 0;
    for(size_t i = 0; i < 8; i++)
    {
        if(b & 0x01)
        {
            acc^=a;
        }
        msb = a & HIGH_BIT_ON_FIELD;
    a <<= 1;
    if(msb)
    {
        a = gf_add(a, FIELD_POLY);
    }
    b>>=1;
    }
    return acc;
}
void printf_m(u8 *a, size_t row, size_t cols)
{
    for(int i = 0; i < row*cols; i++)
        if(i%cols==0)cout <<endl << (int) a[i] << " ";
        else cout << (int) a[i] << " ";
    cout << endl;
}
u8 gf_pow(u8 a, u8 b)
{
    if(0==b)
    {
        return 1;
    } else if (1 == b)
    {
        return a;
    }
    u8 z = a;
    for(size_t i = 0; i < b - 1; ++i)
        z = multiply_gf(z,a);
    return z;
}
void gf_divide(u8 a, u8 b, u8 *q, u8 *r, u8 field_poly)
{
    u8 i = 0;
    u8 quotient = 0x00;
    u8 rem = b;
    u8 msb=0x00;
    msb = a & HIGH_BIT_ON_FIELD;
    while(0 == msb && i < 8)
    {
        a <<=1;
        msb = a & HIGH_BIT_ON_FIELD;
        i++;
    }
    if(field_poly)
    {
        quotient |= (1<<(i+1));
        rem^=(a << 1);
    }
    for(size_t j = 0; j < i+1; ++j)
    {
        if((rem<<j) & HIGH_BIT_ON_FIELD)
        {
            quotient  |= (1<<(i - j));
            rem^=a;
        }
        a >>= 1;
    }
    *q = quotient;
    *r = rem;
}
u8 gf_inverse(u8 a, u8 b)
{
    if(a == 0x00)
    {
        return 0;
    }
    u8 rem[8];
    u8 aux[8];
    u8 q, r;
    size_t i = 1;
    rem[0] = b;
    rem[1] = a;
    aux[0] = 0;
    aux[1] = 1;
    while(rem[i] > 0x01)
    {
        i++;
        if(i == 2)
        {
            gf_divide(rem[i-1], rem[i-2], &q, &r, 1);
        } else {
            gf_divide(rem[i-1], rem[i-2], &q, &r, 0);
        }
        rem[i] = r;
        aux[i] = multiply_gf(q, aux[i-1])^aux[i-2];
    }
    return aux[i];
}
    
int main()
{
    u8 row = 4, col = 4;
    u8 matrix[16] = {
                        0,0,2,1,
                        0,0,1,1,
                        3,0,1,2,
                        2,0,0,1
                    };      
    printf_m(matrix, row, col);
    u8 rs = 0;
    u8 swap = 0;
    u8 inverse = 0;
    for(size_t k=0,i,j,im; k < row-1; k++)
    {
        im = k;
        for(i = k + 1; i < row; i++)
        {
            if(matrix[im*col+k] < matrix[i*col+k])
            {
                    im = i;
            }
        }
        if(im != k)
        {
            for(j = 0; j < col; j++)
            {
                swap = matrix[im*col+j];
                matrix[im*col+j] = matrix[k*col+j];
                matrix[k*col+j]=swap;
            }
        }
        printf_m(matrix, row, col);
        if(matrix[k*col+k] != 0 && matrix[k*col+k] !=1)
        {
            inverse = gf_inverse(matrix[k*col+k], FIELD_POLY);
            for(j = k; j < col; j++)
            {
                matrix[k*col+j]=multiply_gf(inverse, matrix[k*col+j]);
            }
        }
        printf_m(matrix, row, col);
        for(i = k + 1; i < row; i++)
        {
            if(matrix[i*col+k] != 0)
            {
                inverse = gf_inverse(matrix[i*col+k], FIELD_POLY);
                for(j = 0; j < col; j++)
                {
                    matrix[i*col+j] = multiply_gf(inverse, matrix[i*col+j]);
                    matrix[i*col+j]  = gf_add(matrix[i*col+j],matrix[k*col+j]);
                }
            printf_m(matrix, row, col);
            }
            
        }
    }
    printf_m(matrix, row, col);
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2020, 22:48
Ответы с готовыми решениями:

Алгебраические операции
Считается ли минус алгебраической операцией в поле целых чисел?

Генераторы псевдослучайной последовательности (Рекурренты в конечном поле )
Нужно сделать генератор псевдослучайной последовательность тип генератора - рекурренты в конечном поле параметры генератора...

Как по-быстрому найти обратный элемент в конечном поле?
пример для gf(5) понятен, достаточно нарисовать таблицу, и там на пересечении элементов с единичкой мы получаем обратный элемент, но как...

3
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 12:10
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
И собственно, вроде сделал правильно, НО получается что конечная матрица у меня дублирует строки и не приводит к ступенчатому виду....
Вроде вполне треугольная матрица получается
1 0 2 3
0 0 1 1
0 0 1 3
0 0 0 3
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
27.10.2020, 12:28  [ТС]
oleg-m1973, ранг должен быть равен трём, а тут получается 4

Добавлено через 48 секунд
oleg-m1973, и последняя строка должна быть не тройка а единица....
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 12:49
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
oleg-m1973, и последняя строка должна быть не тройка а единица....
У тебя вроде первое же преобразование приводит матрицу к какому то странному виду. Там вроде сначала надо просто строки упорядочить, насколько я понимаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.10.2020, 12:49
Помогаю со студенческими работами здесь

В одном слое есть поле для ввода текста,в другом происходит зацикливание с помощью gotoandplay() на конечном фрейме,когда ввожу текст не успеваю
В одном слое есть поле для ввода текста,в другом происходит зацикливание с помощью gotoandplay() на конечном фрейме,когда ввожу текст не...

Записать результат операции в текстовое поле
Добрый день! Подскажите, пожалуйста, как правильно сделать, чтобы результат операции записался в текстовое поле. string ResultText =...

Побитовые операции в си (вывести поле длины к слево от n разряда)
Вывести в десятичном виде поле длины k двоичного представления данного натурального числа слева от n-го разряда.

Арифметическое действие определяется введением знака операции в другом текстовом поле
На форме расположите клопку и три текстовых поля.Подпишите клопку &quot;результат&quot;.Запрограмируйте вывод в поле заголовка формы результата...

Битовые операции. Написать программу для хранения в битовом поле информации о конфигурации компьютера.
1. Написать программу для хранения в битовом поле информации о конфигурации компьютера. Например: Корпус AT – 0, ATX – 1; Видео на борту –...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru