С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/34: Рейтинг темы: голосов - 34, средняя оценка - 4.97
5 / 5 / 1
Регистрация: 24.09.2012
Сообщений: 178
1

Реализовать поле Галуа

21.01.2014, 01:49. Показов 6099. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно реализовать поле Галуа GF(2^m) на с++.
Хочу реализовать так:
создать класс
C++
1
2
3
4
5
6
7
8
9
10
11
class GF
{
public:
    GF();
 
    GF operator+(const GF&);
    GF operator*(const GF&);
private:
    int poly;
    int root;
}
Каждый элемент поля представляется в двух видах: root и poly. Первый удобен для умножения, а второй -- для сложения.
Также, мне нужны: генерирующий полином int genPoly две таблички int *rootTable и int *polyTable, которые я буду использовать для сложения и умножения как LookUp Table.
Нужно, чтоб genPoly можно было задать предварительно, с его помощью создать две таблички (их размер зависит от genPoly) и сделать их недоступными для дальнейшей модификации. Как это лучше реализовать?

Не по теме:

Кстати, если эта реализация плохая -- готов рассмотреть вашу. Ссылки на opensource не предлагать.



Добавлено через 3 часа 2 минуты
Напишу подробнее, что я имел ввиду.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class GF
{
public:    
    /*
    ...
    */
    void initTable(const int genPoly);
private:
    /*
    ...
    */
    static const int *rootTable; // *
};
 
/*
...
*/
void GF::initTable(const int genPoly)
{
    rootTable = new int[genPolyDegree]; // **
    // ...
}
* - const для запрещения модификации и static для запрещения создания копии при создании экземпляров.
** - в этом месте выдаёт ошибку unresolved external symbol rootTable.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2014, 01:49
Ответы с готовыми решениями:

Поле Галуа
1)Построить поле GF(2^5) по модулю p(x) = x^5 + x +1. 2)Операции в этом поле. Прошу помощи...

Построить поле Галуа
Как реализовать на языке программирования задачу построения поля Галуа на си. Вот неприводимый...

Поле Галуа. Решить систему
необходимо решить в GF(23) систему 2х+2у=3 х+2у=2

Поле Галуа из 256 элементов (умножение)
Здравствуйте. В универе задали реализовать умножение в поле Галуа из 256 элементов. Прочёл статью...

9
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.01.2014, 07:57 2
Функцию имеет смысл сделать статической:
C++
1
static void initTable(const int genPoly);
А статическое поле нужно определить вне класса:
C++
1
const int* GF::rootTable;
http://ideone.com/Yi3P8S
1
5 / 5 / 1
Регистрация: 24.09.2012
Сообщений: 178
21.01.2014, 18:13  [ТС] 3
Спасибо большое!!!
Т.е., когда я пишу
C++
1
static const int *rootTable;
внутри класса -- это всего лишь даёт членам класса доступ к этой переменной, но память на неё выделять сам класс не умеет?

Добавлено через 6 минут
И ещё вопрос: чем отличается statc const от const static?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.01.2014, 18:24 4
Цитата Сообщение от vlad_light Посмотреть сообщение
это всего лишь даёт членам класса доступ к этой переменной, но память на неё выделять сам класс не умеет?
это называется "переменная объявлена (declared), но не определена (defined)".
Только для интегральных типов (int,char, например) объявление в классе статической константы будет являться и определением. Хотя тут тоже есть нюансы, например если захотите взять от нее адрес, то нужно всё равно будет определить ее вне класса.
Цитата Сообщение от vlad_light Посмотреть сообщение
чем отличается static const от const static?
Ничем.
1
5 / 5 / 1
Регистрация: 24.09.2012
Сообщений: 178
22.01.2014, 00:08  [ТС] 5
Цитата Сообщение от Tulosba Посмотреть сообщение
Только для интегральных типов (int,char, например)
Думал, что int* тоже к ним относится.

Добавлено через 5 часов 28 минут
Вот, я написал -- может кому будет полезно...
Можете, пожалуйста, глянуть код и по исправлять ошибки. Заранее благодарен!
Кликните здесь для просмотра всего текста
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
// GF.h
 
#pragma once
 
typedef unsigned char uint8;
typedef unsigned int uint32;
 
class GF
{
public:    
    GF();
    GF(const uint32 polynomial);
 
    static void initializeTable(const uint32 generatorPolynomial, const uint8 generatorPolynomialDegree);
    static void deleteTable();
 
    GF operator+(const GF& rhs) const; // operator- is the same as operator+
    GF operator*(const GF& rhs) const;
    GF invert() const; // a/b == a * b.invert
 
 
private:
    uint32 m_polynomial;
 
    static uint32 m_generatorPolynomial;    
    static const uint32* m_polynomialTable;
    static const uint32* m_rootTable;
    static uint32 m_tableSize;
};
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
// GF.cpp
 
#include "GF.h"
 
const uint32* GF::m_polynomialTable = nullptr;
const uint32* GF::m_rootTable = nullptr;
uint32 GF::m_generatorPolynomial = 0;
uint32 GF::m_tableSize = 0;
 
GF::GF()
{
 
}
 
GF::GF(const uint32 polynomial)
{
    m_polynomial = polynomial;
}
 
void GF::initializeTable(const uint32 generatorPolynomial, const uint8 generatorPolynomialDegree)
{
    deleteTable();
 
    m_generatorPolynomial = generatorPolynomial;
 
    m_tableSize = (1 << generatorPolynomialDegree) - 1;
    uint32* table = new uint32[m_tableSize];
 
    // construct root table
    for(uint8 i = 0; i < generatorPolynomialDegree; ++i)
        table[i] = 1 << i;
 
    uint32 tableMask = (1 << generatorPolynomialDegree) - 1;
    for (uint32 i = generatorPolynomialDegree; i < m_tableSize; ++i)
    {
        table[i] = table[i - 1] << 1;
 
        if(table[i - 1] >> (generatorPolynomialDegree - 1))
        {
            table[i] ^= m_generatorPolynomial;
            table[i] &= tableMask;
        }
    }
 
    m_rootTable = table;
    
    // construct polynomial table
    table = new uint32[++m_tableSize];
    table[0] = 0;
    for(uint32 i = 0; i < m_tableSize - 1; ++i)
        table[m_rootTable[i]] = i;
 
    m_polynomialTable = table;
}
 
void GF::deleteTable()
{
    if((m_polynomialTable != nullptr) && (m_rootTable != nullptr))
    {
        delete[] m_polynomialTable;
        delete[] m_rootTable;
        m_polynomialTable = nullptr;
        m_rootTable = nullptr;
    }
}
 
GF GF::operator+(const GF& rhs) const
{
    return GF(m_polynomial ^ rhs.m_polynomial);
}
 
GF GF::operator*(const GF& rhs) const
{
    if(this->m_polynomial == 0)
        return *this;
    if(rhs.m_polynomial == 0)
        return rhs;
 
    return GF(m_rootTable[(m_polynomialTable[m_polynomial] + m_polynomialTable[rhs.m_polynomial]) % (m_tableSize - 1)]);
}
 
GF GF::invert() const
{
    if(m_polynomial == 0)
        throw "Division by zero";
 
    return GF(m_rootTable[m_tableSize - 1 - m_polynomialTable[m_polynomial]]);
}
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.01.2014, 00:14 6
Память, выделенную new[] необходимо освободить.
Используйте список инициализации в конструкторе
C++
1
2
GF::GF(const uint32 polynomial) :
    m_polynomial(polynomial) {}
0
5 / 5 / 1
Регистрация: 24.09.2012
Сообщений: 178
22.01.2014, 00:17  [ТС] 7
Используйте список инициализации в конструкторе
У меня почему-то в msvs 2010 express оно не хочет так делать. Это, наверное, начиная с с++11 так можно делать.
Память, выделенную new[] необходимо освободить.
У меня это делает функция static void deleteTable();. Можно как-то сделать выделение и освобождение памяти автоматически?
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.01.2014, 00:19 8
Цитата Сообщение от vlad_light Посмотреть сообщение
Это, наверное, начиная с с++11 так можно делать.
нет, это можно было делать еще до него. Видимо вы что-то неверно делаете.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.01.2014, 00:22 9
Цитата Сообщение от vlad_light Посмотреть сообщение
Можно как-то сделать выделение и освобождение памяти автоматически?
Создать тип, который будет в конструкторе выделять память, в деструкторе освобождать. И сделать статическую переменную этого типа в классе.
С другой стороны, так как статическая переменная существует все время работы программы, можно особо не заморачиваться с удалением. Все равно система почистит после завершения процесса.
1
5 / 5 / 4
Регистрация: 13.11.2015
Сообщений: 129
01.04.2017, 19:11 10
а как здесь выводить поле Галуа? я имеюю ввиду в виде таблицы
0
01.04.2017, 19:11
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.04.2017, 19:11
Помогаю со студенческими работами здесь

Поля Галуа
Задача состоит в том, что есть некое поле Галуа GF*(p), где р (простое число) - характеристика...

Вопрос по полю Галуа
Здравствуйте.Созрел вопрос по конечному полю - полю Галуа.Разъясните пож-та как находится обратный...

Насколько сложна теория Галуа?
Если взять всю алгебру и оценивать от 1 до 10?

Написать класс для реализации полей Галуа
Здравствуйте! Нужно реализовать поля Галуа GF (2^n). 1. Запросить у пользователя ввести число n. ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru