О том как перемножать матрицы n×n
(II. или о случайных блужданиях на flip-graph)
Продолжаем решать задачу о поиске оптимального алгоритм для умножения матриц (начало в посте выше). Хотим найти за наименьшее число троек (триад) n²-мерных векторов (u, v, w) разложение Tᵢⱼₖ = Σ uᵢ vⱼ wₖ . Число троек называют рангом r. Дальше правильное разложение буду обозначать за UVW(r).
Рассмотрим некоторое разложение UVW(r=n²), такое всегда существует. Если у двух триад совпадает один из векторов, то можем сделать flip и перейти к новому UVW(r). Продолжаем делать случайные флипы, пока у двух триад не совпадёт два вектора, тогда можем сделать reduction и попасть в UVW(r-1). Если к операциям добавить ещё путь к UVW(r+1), то получим образующие для flip-graph, но нам часто достаточно ходить горизонтально и вниз.
Просто случайными блужданиями по flip-графу здесь (и тут с учётом симметрий) и нашли рекордные на сегодня схемы: r=93 для n=5 и r=153 для n=6 (было 98 и 160). Интересно, можно ли как-то сделать блуждания направленными.
Мою PyTorch реализацию (ну приятно же на gpu случайно блуждать) можно потыкать на
github.com/k1242/flip-graph
(или поддержать звёздочками). Для n=3 находит оптимальные алгоритмы за 10с, а это, между прочим, поиск кратчайшего пути на графе в 2⁷²⁹ ~ 10²¹⁹ вершин :)
(II. или о случайных блужданиях на flip-graph)
Продолжаем решать задачу о поиске оптимального алгоритм для умножения матриц (начало в посте выше). Хотим найти за наименьшее число троек (триад) n²-мерных векторов (u, v, w) разложение Tᵢⱼₖ = Σ uᵢ vⱼ wₖ . Число троек называют рангом r. Дальше правильное разложение буду обозначать за UVW(r).
Рассмотрим некоторое разложение UVW(r=n²), такое всегда существует. Если у двух триад совпадает один из векторов, то можем сделать flip и перейти к новому UVW(r). Продолжаем делать случайные флипы, пока у двух триад не совпадёт два вектора, тогда можем сделать reduction и попасть в UVW(r-1). Если к операциям добавить ещё путь к UVW(r+1), то получим образующие для flip-graph, но нам часто достаточно ходить горизонтально и вниз.
Просто случайными блужданиями по flip-графу здесь (и тут с учётом симметрий) и нашли рекордные на сегодня схемы: r=93 для n=5 и r=153 для n=6 (было 98 и 160). Интересно, можно ли как-то сделать блуждания направленными.
Мою PyTorch реализацию (ну приятно же на gpu случайно блуждать) можно потыкать на
github.com/k1242/flip-graph
(или поддержать звёздочками). Для n=3 находит оптимальные алгоритмы за 10с, а это, между прочим, поиск кратчайшего пути на графе в 2⁷²⁹ ~ 10²¹⁹ вершин :)