lumag: (Default)
[personal profile] lumag

Коллеги,

В кои-то веки столкнулся с задачкой, которую я не знаю как оптимизировать. Надо побитово умножить число на матрицу.

Псевдокод:

unsigned val;
unsigned A[];
unsigned res;
int i;
...
res = 0;
for (i = 0; i < 32; i++)
  if (val & (1 << i))
    res ^= A[i];

Пара моих попыток подойти в лоб не увенчалась серьезным ускорением.

Кто-нибудь может что-нибудь хорошее подсказать/сообразить? А то я, кажется, отвык решать такие задачи.

UPD: Получил ускорение ~30% тупо раскрыв цикл. Все равно очень медленно. Хочется чего-то более радикального.

UPD2: Матрица - фиксированная, число изменяется.

Date: 2013-09-01 09:31 am (UTC)
From: [identity profile] denspb.livejournal.com
Это одиночное действие?
И если повторяющееся, то матрица/число оказываются одинаковыми?

Date: 2013-09-01 03:08 pm (UTC)
From: [identity profile] antilamer.livejournal.com
Можно попробовать так:
* для каждого из 256 возможных байтов закешировать результат умножения A на вектор этого байта: m
* разбить val на 4 байта b1, b2, b3, b4
* res ^= m[b1] ^ m[b2] ^ m[b3] ^ m[b4]

UPD: увидел вконтакте, что тебе Саша Аланов то же самое написал, и что это ускоряет в 8 раз. Ну что ж, круто :)
Edited Date: 2013-09-01 03:23 pm (UTC)

Date: 2013-09-01 04:08 pm (UTC)
From: [identity profile] denspb.livejournal.com
Тогда та же идея то и у [livejournal.com profile] antilamer.

Profile

lumag: (Default)
Dmitry Eremin-Solenikov

March 2016

S M T W T F S
  12345
6789 101112
13141516171819
20212223242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 04:35 pm
Powered by Dreamwidth Studios