2009-08-01 5 views
3

Что такое хороший способ реализации исключения Гаусса, когда операторы являются пользовательскими операторами, а не стандартными арифметическими?Гауссово исключение с помощью пользовательских операторов

Вот операторы:

Дополнение

0 + 0 = 0 
0 + 1 = 1 
1 + 1 = 0 

Вычитание:

0 - 0 = 0 
0 - 1 = 1 
1 - 1 = 0 

Умножение:

0 * 0 = 0 
0 * 1 = 0 
1 * 1 = 1 

Отдел:

0/0 = illegal 
0/1 = 0 
1/1 = 1 

Вот пример набор уравнений как расширенная матрица, с ОРЗ в правой колонке:

1, 1, 0, 1, 0, 0, 0, 0, 0, 1 
0, 1, 0, 1, 1, 0, 0, 0, 0, 1 
0, 1, 1, 0, 0, 1, 0, 0, 0, 1 
1, 0, 0, 1, 0, 0, 0, 0, 0, 1 
0, 1, 0, 1, 1, 0, 0, 0, 0, 1 
0, 0, 0, 0, 0, 1, 0, 0, 0, 1 
0, 0, 0, 1, 0, 0, 1, 0, 0, 1 
0, 0, 0, 1, 1, 0, 1, 1, 0, 1 
0, 0, 0, 0, 0, 1, 0, 0, 1, 1 

Решение для этого набора:

x1 = 1 
x2 = 0 
x3 = 0 
x4 = 0 
x5 = 1 
x6 = 1 
x7 = 1 
x8 = 1 
x9 = 0 

Gaussian для меня это не удалось, поскольку я попробовал это на этом наборе.

Уравнения будут иметь 9, 16, 25 или 36 терминов. Было бы здорово, если бы алгоритм легко расширялся до больших квадратов, до 100. Я ищу алгоритм, в псевдокоде или JavaScript, желательно.

+0

Обратите внимание, что из-за новых операторов некоторые множества уравнений становятся неразрешимыми, так как их результаты будут дробями. Меня особенно интересует вопрос разрешимости. – Killroy

ответ

6

Алгоритм гауссова алгоритма в псевдокоде можно найти here.

Не имеет значения, используете ли вы «нормальные» номера, или если вы находитесь в Z кольцом, алгоритм остается прежним.

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

К сожалению, поскольку вы упомянули JavaScript, вы не можете переопределить операторов на этом языке, чтобы это стало немного сложнее. Я думаю, вы могли бы определить функции, которые будут выполнять работу операторов и использовать их вместо стандартных операторов.

function add(v1, v2) { 
    if ((v1 != 0 && v1 != 1) || (v2 != 0 && v2 != 1)) { 
     alert('Invalid params'); 
     return; 
    } 

    return (v1 + v2) % 2; 
} 

function subtract(v1, v2) { 
    if ((v1 != 0 && v1 != 1) || (v2 != 0 && v2 != 1)) { 
     alert('Invalid params'); 
     return; 
    } 

    return Math.abs((v1 - v2) % 2); 
} 

function multiply(v1, v2) { 
    if ((v1 != 0 && v1 != 1) || (v2 != 0 && v2 != 1)) { 
     alert('Invalid params'); 
     return; 
    } 

    return v1 * v2; 
} 

function divide(v1, v2) { 
    if ((v1 != 0 && v1 != 1) || (v2 != 0 && v2 != 1)) { 
     alert('Invalid params'); 
     return; 
    } else if (v2 == 0) { 
     alert('Divider cannot be zero'); 
     return; 
    } 

    return v1/v2; 
} 
+0

Операторы не будут большой проблемой, они примерно соответствуют побитовым операторам.Я думаю, я могу просто использовать алгоритм из Википедии. Я знал об этом, просто не был уверен, как все это будет соответствовать друг другу. – Killroy

3

То, что вы описали, не является обычным оператором. Скорее, это Z со стандартным добавлением и умножением по модулю 2.

Это field; поэтому у вас нет проблем с «фракцией».

Алгоритм исключения Гаусса не ограничивается полем действительных чисел; он также работает на Z .

+0

Я провалил свое университетское исчисление 10 лет назад;) Я бы очень оценил алгоритм! – Killroy

+5

Это алгебра, а не исчисление :) – balpha

+0

Я читал фантастические романы, не обращая внимания на лекции, хорошо? И да, я не всегда был в правильной комнате ... – Killroy

Смежные вопросы