2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Проверка функции на линейность, реализация в си
Сообщение22.04.2014, 20:30 


04/05/13
125
Здравствуйте! Пишу программу на си которая проверяет булевую функцию на линейность. Я знаю как это сделать, но не знаю как обосновать мой метод.
Входные параметры это количество переменных и таблица значений. Я нахожу коэффициенты полинома Жегалкина и по ним определяю линейность функции. Для этого я использую алгоритм сортировки слиянием, только функция которая занимается "слиянием" работает следующим образом: первую часть записывает без изменений, а вторую часть записывает как сумма (по модулю два естественно) первой и второй частей (поэлементно). В результате, мы получаем коэффициенты полинома Жегалкина.
Этот алгоритм я узнал через друга, который в свою очередь узнал его у кого-то еще и не смог объяснить мне на чем это основывается. Начал копаться в гугле и нашел похожий способ, в википедии он назывется "методом треугольника". Я подозреваю что именно он лежит в основе моего алгоритма, только как это понять?

 Профиль  
                  
 
 Re: Проверка функции на линейность, реализация в си
Сообщение22.04.2014, 21:38 
Заслуженный участник


27/04/09
28128

(Моё нескромное мнение.)

Описание алгоритма настолько аккуратно и подробно, что не возникает сомнений, что он делает то, что должен делать. :wink:

 Профиль  
                  
 
 Re: Проверка функции на линейность, реализация в си
Сообщение22.04.2014, 22:17 


04/05/13
125
Надо только придумать чем связан этот "метод треугольника" и мой алгоритм(точнее тот, который мне подсказали).

 Профиль  
                  
 
 Re: Проверка функции на линейность, реализация в си
Сообщение23.04.2014, 08:08 


04/05/13
125
Возникла другая проблема...код который я использую выдает не тот результат. Вот сам код:
Код:
int Merge(int *a, int start, int end)
{
int half=(start+end)/2, i;
for(i=0;i<=half;i++)
{
  a[half+1+i]+=a[i];
  a[half+1+i]=a[half+1+i] % 2;
}
return 0;
}

int Coefficients(int *a, int mStart, int mEnd)
{
if(mStart<mEnd)
{
  Coefficients(a, mStart, (mStart+mEnd)/2);
  Coefficients(a, (mStart+mEnd)/2+1, mEnd);
  Merge(a, mStart, mEnd);
}
return 0;
}


Главная функция вызывает функцию Coefficients, задавая массив значений, начало и конец массива.
Я тестировал код на наборе "0110"=>получалось "0111" (должно было получится "0110")
на "0111"=>"0110" (должно было получится "0111")
на "11111111"=>"10000100" (должно было получится "10000000")

Можете подсказать где я ошибся?
Ps Алгоритм работает по принципу описанному в первом сообщении

-- 23.04.2014, 10:26 --

Уже нашел ответ почему: цикл не с того элемента начинается :mrgreen:

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: dgwuqtj


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group