Я ищу быстрый способ вычисления степени матрицы A в поле Галуа 2 (GF(2) а>). A
— двойная матрица, и ее возведение в степень x
обозначается
A^x = A * A * A * ... * A (x times)
Простой способ заключается в том, что преобразует A
в GF (2) (поскольку данная матрица A
является двойной матрицей), а затем выполняет операцию возведения в степень. Код Matlab
A1 = gf(A, 2) % // convert to galois field
A_pow_x_first = A1^x; % // Perform A^x
Однако этот способ занимает много времени, чтобы преобразовать матрицу A
в GF (2). Я ищу быстрый способ без преобразования GF (2). То есть я использую операцию мода
A_pow_x_second = mod(A^x, 2)
Однако проблема в том, что результат первого и второго способа не похож. Проблема в том, что переполнение числа. Один член предложил мне преобразовать матрицу A
в int64. Тем не менее, я думаю, что это не лучший способ справиться с моей проблемой. Не могли бы вы предложить мне быстрый способ сделать это в Matlab? заранее спасибо
Это простой пример
>> A = [1 0 1
0 1 1
1 1 1]
Первый способ,
>> A_pow_x_first = gf(A, 2)^50
Результат:
0 1 0
1 0 0
0 0 1
Второй способ
>> A_pow_x_second = mod(A^50, 2)
A_pow_x_second =
0 0 0
0 0 0
0 0 0
Как быстро вычислить A^x
без преобразования в GF(2), который имеет аналогичный результат в первом случае?
(A^i)*b
вы должны вместо этого вычислитьA*(A*(..*(A*b)))
[mod 2] с помощью циклаfor
! И, конечно же, для вычисления(A^(i+1))*b)
вы должны повторно использовать результат предыдущего вычисленияA*(A^i)*b
. - person knedlsepp   schedule 12.01.2015double
. MATLAB (и IEEE 754) используют 52 бита для дроби и 11 бит для экспоненты. С 52 битами для дроби вы получите точность около 16 цифр в десятичной системе. Этого никогда не бывает достаточно для тех ценностей, которые у вас есть. - person hbaderts   schedule 12.01.2015