Если коротко, то идея в том чтобы некоторым образом обобщать разделение переменных на многомерный случай.
Например для матриц, если есть матрица

ранга

, то ее можно записать в виде

или

что соответсвует ситуации когда индексы

и

в матрице

разделяются идеально. В общем случае для матрицы ранга

имеем
Понятно, что если ранг

мал, то хранение вместо матрицы

векторов

сильно снижает объем данных которые мы храним -

вместо

.
Если попробовать обобщать это на многомерные массивы (скажем трехмерные) в виде

- это так называемое каноническое разложение тензора (CP - canonical polyadic), и определить "ранг" как минимальное

, такое что такое разложение найдется, то оказывается что это очень плохое во всех смыслах определение, например задача о поиске CP ранга произвольного тензора является NP полной. Ну и там всякие вещи что при произвольно малом возмущении ранг может скакнуть и стать вообще любым.
Поэтому люди стали думать какие еще разложения можно придумать. Есть разложение Такера, есть TT (Tensor-Train) разложение. Первое для тензоров с больше чем

модами мало используется, поэтому напишу про второе. Мы представляем

- мерный тензор

в виде списка из

-х мерных тензоров

, таких что

, где

- числа которые называют рангами TT-тензора и

. "Ядра"

удовлетворяют соотношению
![$$X^{i_1 i_2 \hdots i_d} = G^{(1)}[:, i_1, :] G^{(2)}[:, i_2, :] \hdots G^{(d)}[:, i_d, :].$$ $$X^{i_1 i_2 \hdots i_d} = G^{(1)}[:, i_1, :] G^{(2)}[:, i_2, :] \hdots G^{(d)}[:, i_d, :].$$](https://dxdy-03.korotkov.co.uk/f/2/a/6/2a6e1bd9aeff2a202544c1c57a5ed20d82.png)
Поясню что имеется ввиду -

это

-х мерный массив. При подстановке туда в качестве среднего индекса

мы получаем матрицу размера

. Произведение этих матриц дает нам число - соответствующий элемент тензора

(число так как размеры крайних ядер есть

и

). Посчитаем число параметров -

что существенно меньше чем изначального размер

-

Для массивов

при

, можно добиться еще более сильного сжатия если сначала его превратить в тензор

тогда сложность будет линейна по

- логарифмическая по

. Идея тут в том что мы вместо индекса используем его бинарное разложение -

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

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

чисел.