Oam писал(а):
К моему большому сожалению, пакет Intel MKL, для меня недоступен.Впрочем, даже в ином случае я был бы бессилен вытащить алгоритм этой функции из скомпилированной библиотеки.
я думаю уважаемый abc_qmost имеет в виду библиотеку LAPACK (произносится "эл-эй-пэк"), которая присутствует в Intel MKL. Эта библиотека разрабатывается широким научным коллективом, и свободно распространяется на том же сайте, что и LINPACK и EISPACK ---
http://www.netlib.org/, точнее
http://www.netlib.org/lapack/. Вот отдельные ссылки на код интересующих вас процедур:
http://www.netlib.org/lapack/explore-html/dsytrd.f.html --- приведение действительной симметричной матрицы к трёхдиагональному виду ортогональными преобразованиями подобия
http://www.netlib.org/lapack/explore-html/dsteqr.f.html --- нахождение собственных значений и векторов трёхдиагональной матрицы методом QR (или QL)
http://www.netlib.org/lapack/explore-html/dsterf.f.html --- QL и QR алгоритмы в форме Pal-Walker-Kahan. Чуть быстрее, но только для собственных значений
http://www.netlib.org/lapack/explore-html/dstebz.f.html --- метод деления пополам для собственных значений
http://www.netlib.org/lapack/explore-html/dstein.f.html --- метод обратных итераций для собственных векторов
http://www.netlib.org/lapack/explore-html/dstedc.f.html --- метод divide and conquer
http://www.netlib.org/lapack/explore-html/dstegr.f.html --- метод на основе relatively robust representations
http://www.netlib.org/lapack/explore-html/dsyev.f.html --- решение задачи для плотной симметричной матрицы на основе перечисленных выше процедур.
Производители процессоров часто выпускают версию библиотеки LAPACK подогнанную под собственные процессора, примерами являются Intel MKL и AMD ACML. К примеру, они выбирают оптимальные размеры блоков в блочных алгоритмах, и компилируют код своим компилятором с оптимально выбранными ключами. Так же они могут модифицировать и сам алгоритм, чтобы он лучше ложился на архитектурные (например, векторные) особенности процессора. Но, я думаю, будь эти изменения принципиальными, они были бы произведены на уровне LAPACK, а не конкретной компиляции. Могу ошибаться.
Некоторые из алгоритмов LAPACK являются улучшенными версиями аналогичных процедур в LINPACK / EISPACK. Улучшения касаются не только скорости, но и надёжности. Под рукой нет ссылки, но могу, например, указать статью расказывающую про подобные улучшения в алгоритме деления пополам.