Если вы используете числовые приближенные матрицы в тестах сингулярности, вы получите намного лучшую скорость.
k = 100; n = 500;
mat = RandomInteger[100, {n, n}];
AbsoluteTiming[Det[mat] == 0]
Out [57] = {6.8640000, False}
AbsoluteTiming[Det[N@mat] == 0.] (*warning light!!*)
Out [58] = {0.0230000, False}
AbsoluteTiming[MatrixRank[N@mat] != n]
Out [59] = {0.1710000, False}
К сожалению, этот самый быстрый тест не является надежным. Но ранговый тест должен хорошо работать. Вот быстрый пример, в котором мы заменяем последнюю строку на сумму предыдущих строк.
mat2 = mat;
mat2[[-1]] = Total[Most[mat]];
AbsoluteTiming[Det[mat2] == 0]
Out [70] = {9.4750000, True}
AbsoluteTiming[Det[N@mat2] == 0.]
Out [69] = {0.0470000, False}
AbsoluteTiming[MatrixRank[N@mat2] != n]
Out [71] = {0.1440000, True}
В принципе, я полагаю, что есть небольшая вероятность того, что ранговый тест может дать ложный отрицательный результат, скажем, из-за плохой подготовки. Поскольку ваше использование будет лучше переносить ложные срабатывания (то есть неправильные утверждения о сингулярности), вы можете вместо этого проверить сингулярность по простому модулю. Я думаю, что это была одна из рекомендаций, сделанных другими.
Продолжая приведенные выше примеры:
AbsoluteTiming[Det[mat, Modulus -> Prime[1000]]]
Out [77] = {0,6320000, 4054}
AbsoluteTiming[Det[mat2, Modulus -> Prime[1000]]]
Out [78] = {0,6470000, 0}
Это медленно, но быстрее, чем работа над рациональными. Что бы это ни стоило, в большинстве случаев я был бы достаточно уверен в результатах более быстрого тестирования через MatrixRank [N [matrix]].
Даниэль Лихтблау
Wolfram Research