IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Деление полиномов, C++ Builder6
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Здравствуйте!

Предположим в качестве входных данных имеется двоичная комбинация, каждый разряд хранится в соответствующем элементе массива (char m[7]={0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0).
И будем ассоциировать для себя этот массив с полиномом x^6 + x^5 + x^3.
Будет ещё один фиксированный полином: char g[4]={0x1, 0x0, 0x1, 0x1} (g=x^3 + x + 1).

Задача заключается в делении m на g..Интересует остаток от деления, который в данном примере будет
char r[3]={0x0, 0x0, 0x1} (r = 1).

пример деления я привела в прикреплённом документе..

Затрудняюсь с тем, как это реализовать..объясните пожалуйста!


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Чтобы это реализовать, надо сначала правильно сделать это столбиком на бумаге. Ты этого не сделала. Потому что проверяется деление полиномов чем? Угу, именно умножением. Умножаем полученное в твоем примере частное на делитель, и прибавляем остаток. Должны получить делимое:

(x3+x+1)*(x3+x2+x+1) + 1 = ?
Раскрываем скобки, приводим подобные, получаем: x6+x5+2x4+3x3+2x2+2x+2. Неверно.

Нашелся вот такой "делитель полиномов", написанный очень давно, еще под ДОС-овским ТурбоС:
#include <stdlib.h>
#include <stdio.h>

int p1[]={0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0};
int p2[]={0x1, 0x0, 0x1, 0x1};

int main() {
int *ptr1=p1;

int del;
int i;
int s1 = sizeof(p1)/sizeof(int);
int s2 = sizeof(p2)/sizeof(int);
int *result = (int*)malloc(sizeof(int)*(s1));
int sresult =0;

while (1) {

del = (int)(*ptr1 / *p2);
result[sresult]=del;
sresult++;
for (i=0; i<s2; i++) {
*(ptr1+i) -= del * p2[i];
}


ptr1++;
s1--;
if (s1<s2) break;

}

printf("Частное: ");
for (i=0; i<sresult; i++) {
if (result[i] >= 0 && i != 0) printf(" + ");
if (sresult-i-1 !=0) {
if (sresult-i-1 != 1) {
printf(" %d*x^%d ",result[i],sresult-i-1);
} else {
printf(" %d*x ",result[i]);
}
} else {
printf(" %d ",result[i]);
}
}

printf("\n");
s1=sizeof(p1)/4;
printf("Остаток: ");
for (i=0; i<s1; i++) {
if (p1[i]!=0) {
if (p1[i]>0) printf(" + ");
if (s1-i-1 !=0) {
printf(" %d*x^%d",p1[i],s1-i-1);
} else {
printf(" %d ",p1[i]);
}
}
}
printf("\n");
}
, ответ, который он выдает: частное = (x3+x2-x-1), остаток = (2x+1). Вот если это проверить умножением, то получаем исходное делимое...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Надо было мне сразу уточнять, что требуется несколько иное...
Такое "деление полиномов", как в прикреплённом мною документе в посте #1, используется при циклическом кодировании, соответственно, если проверять полученное мною умножением (вместо обычного сложения использовать суммирование по модулю два, т.е. исключающее ИЛИ), то всё сходится:

(x^3 + x^2 + x + 1)(x^3 + x + 1) + 1 =
x^6 + x^4 + x^3 + x^5 + x^3 + x^2 + x^4 + x^2 + x + x^3 + x + 1 + 1 =
x^6 + x^5 + x^3

(т.е. х с одинаковыми степенями взаимоуничтожились)..

Вот тут так же есть пример того, что мне нужно реализовать..
INTUIT.ru


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 29.04.2009 2:07) *

#include <stdlib.h>
#include <stdio.h>

int p1[]={0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0};
int p2[]={0x1, 0x0, 0x1, 0x1};

int main() {
int *ptr1=p1;

int del;
int i;
int s1 = sizeof(p1)/sizeof(int);
int s2 = sizeof(p2)/sizeof(int);
int *result = (int*)malloc(sizeof(int)*(s1));
int sresult =0;

while (1) {

del = (int)(*ptr1 / *p2);
result[sresult]=del;
sresult++;
for (i=0; i<s2; i++) {
*(ptr1+i) ^= del * p2[i]; //вот здесь XOR
}
ptr1++;
s1--;
if (s1<s2) break;

}

printf("Частное: ");
for (i=0; i<sresult; i++) {
if (result[i] >= 0 && i != 0) printf(" + ");
if (sresult-i-1 !=0) {
if (sresult-i-1 != 1) {
printf(" %d*x^%d ",result[i],sresult-i-1);
} else {
printf(" %d*x ",result[i]);
}
} else {
printf(" %d ",result[i]);
}
}

printf("\n");
s1=sizeof(p1)/4;
printf("Остаток: ");
for (i=0; i<s1; i++) {
if (p1[i]!=0) {
if (p1[i]>0) printf(" + ");
if (s1-i-1 !=0) {
printf(" %d*x^%d",p1[i],s1-i-1);
} else {
printf(" %d ",p1[i]);
}
}
}
printf("\n");
}


Заменила вычитание на XOR - вроде получается результат, который мне нужен.

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Ну, так замени в 23-ей строке той программы, что я привел, вычитание на сложение по модулю 2:

               for (i=0; i<s2; i++) {
*(ptr1+i) ^= del * p2[i]; // <--- Вот так
}
и получишь частное = 1*x^3 + 1*x^2 + 1*x + 1, и остаток = + 1
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.05.2024 3:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name