1. Наивное умножение матрицы на вектор и умножение матриц.

Умножение матрицы A (n x m) на вектор b (m): 
    c[i] = Σ (A[i][j] * b[j]), j = 0, ..., m-1.
Умножение двух матриц A (n x k) и B (k x m):
    C[i][j] = Σ (A[i][s] * B[s][j]), s = 0, ..., k-1.
Сложность для квадратных матриц: O(n^3).

2. Иерархия памяти, кэш и промахи.

Память организована в уровнях: регистры → кэш (L1, L2, L3) → RAM → накопители → облачные хранилища.
Кэш использует стратегии: полностью ассоциативный, прямо ассоциативный, наборная ассоциативность.
Стратегия LRU вытесняет давно неиспользуемые данные.
Типы промахов: холодный, из-за конфликта, из-за емкости.
Эффективность повышается за счёт пространственной и временной локальности.

3. Алгоритм Штрассена.

Для матриц A, B (n x n):
Разбиваются на блоки (n/2 x n/2): A = |A11 A12|, B = |B11 B12|.
Вычисляются 7 матриц: 
    M1 = (A11 + A22) * (B11 + B22), ..., M7 = (A12 - A22) * (B21 + B22).
Собирается C: 
    C11 = M1 + M4 - M5 + M7, ..., C22 = M1 - M2 + M3 + M6.
Сложность: O(n^(log2(7))).

4. Собственные векторы и значения, Google PageRank.

Собственный вектор X и значение λ:
    AX = λX,  (A - λE)X = 0,  |A - λE| = 0.
Собственные значения находятся как корни характеристического многочлена Pn(λ) = |A - λE|.
PageRank: важность страницы pi:
    p_i = Σ (p_j / L(j)), для всех j ∈ N(i), где L(j) - число ссылок со страницы j.
Это выражается как p = Gp, где G[i][j] = 1/L(j). У матрицы G наибольшее собственное значение равно 1.

5. Разложение Шура и QR-алгоритм.

Теорема Шура: любая матрица A представима в виде A = UTU*, где U - унитарная, T - верхнетреугольная.
Собственные значения матрицы A равны диагональным элементам T.
QR-алгоритм:
    1. Инициализируем A0 = A.
    2. Вычисляем QR-разложение: Ak = QkRk.
    3. Обновляем: Ak+1 = RkQk.
Итерации продолжаются, пока Ak не станет достаточно треугольной. Сложность одной итерации: O(n^3).

6. Степенной метод.

Для нахождения наибольшего по модулю собственного значения λ1 матрицы A:
    x(k+1) = A * x(k) / ||A * x(k)||.
Приближение λ1:
    λ(k+1) = (A * x(k+1), x(k+1)).
Метод сходится со скоростью |λ2/λ1|, где λ2 - следующее по величине собственное значение.
Для эрмитовых матриц метод всегда сходится, так как собственные значения действительны.

7. Круги Гершгорина.

Собственные значения λ матрицы A лежат внутри кругов C_i с центром в a_ii и радиусом:
    r_i = Σ |a_ij|, для j ≠ i.
Если круги C_i не пересекаются, каждый содержит ровно одно собственное значение.
Для матриц с диагональным преобладанием (|a_ii| > r_i для всех i) матрица невырожденна.

8. Разложение Шура.

A = UTU*, где U - унитарная, T - верхнетреугольная. Это разложение стабильно вычисляется и точно даёт собственные значения.
Для нормальных матриц (AA* = A*A) разложение принимает вид A = UΛU*, где Λ - диагональная матрица собственных значений.
Нормальные матрицы всегда унитарно диагонализуемы.

9. Нормальные, эрмитовы, унитарные матрицы.

Нормальная матрица: AA* = A*A.
Эрмитова матрица: A = A*, элементы удовлетворяют A[i, j] = conj(A[j, i]).
Любая эрмитова матрица может быть приведена к трёхдиагональной форме с помощью отражений Хаусхолдера.
Матрица 𝐴 имеет верхне-гессенбергову форму, если 𝑎𝑖𝑗 = 0, при 𝑖 ≥ 𝑗 + 2.

10. Спектр и псевдоспектр.

Спектр матрицы A - множество собственных значений λ, для которых Ax = λx.
Псевдоспектр Λ_ε(A):
    Λ_ε(A) = {λ ∈ C : ||(A - λI)^(-1)|| ≥ 1/ε}.
Для нормальных матриц псевдоспектр близок к спектру, но для ненормальных может иметь сложную форму.
Радиус спектра ρ(A) = max |λ| указывает на поведение динамических систем.

11. Неявный QR алгоритм  
Неявный QR алгоритм применяется для нахождения собственных значений матриц через разложение A = QH, где H — верхне-гессенбергова форма. Для повышения сходимости увеличивают зазор между собственными значениями блоков матрицы, выражаемый через параметр q = |λ(m+1)/λm|. Алгоритм использует сдвиги, уменьшающие влияние малых собственных значений: A(k) - s(k)I = Q(k)R(k), A(k+1) = R(k)Q(k) + s(k)I. Сдвиги выбираются близкими к собственным значениям (например, сдвиги Релея), что повышает точность и ускоряет вычисления. Это делает метод эффективным для работы с крупными разреженными системами.

12. Алгоритм "разделяй и властвуй"  
Алгоритм "разделяй и властвуй" делит задачу на подзадачи меньшего размера, решает их независимо и объединяет результаты. В случае симметричных трехдиагональных матриц T она может быть представлена как блочная структура:  
T =  
[ T1   0   v ]  
[  0  T2   w ]  
[ v^T w^T   d ].  

Матрица делится на подматрицы T1 и T2, для которых вычисляются собственные значения и векторы. Затем эти результаты объединяются с учетом элементов связи v, w и d, используя теорему о возмущениях собственных значений. Алгоритм эффективен для параллельных вычислений и позволяет оптимально обрабатывать разреженные матрицы.

13. Разреженные матрицы и методы  
Разреженные матрицы, содержащие много нулевых элементов, используются для экономии памяти и ускорения вычислений. Основные форматы хранения включают COO (тройки), CSR (построчные данные), CSC (постолбцовые) и LIL (списки). Прямые методы решения включают LU-разложение, метод Холецкого и алгоритмы решения линейных систем вида Ax = b (например, из библиотеки Scipy). Эти методы обеспечивают эффективную работу с большими задачами благодаря оптимизации хранения и вычислений. Разреженные структуры часто встречаются в задачах физики, механики и компьютерной графики.

14. Обыкновенные дифференциальные уравнения (ОДУ)  
ОДУ представляют собой уравнения вида F(x, y, y', ...) = 0, где y(x) — искомая функция. Наивысший порядок производной определяет порядок уравнения. Для нахождения уникального решения часто используется задача Коши с начальными условиями y(0) = y0. Решение может быть представлено в явной форме y(x) или в неявной форме Φ(x, y) = 0. Такие уравнения описывают динамику процессов в науке и технике.

15. Локальная и глобальная ошибки  
Локальная ошибка возникает на каждом шаге вычислений из-за ограниченной точности или упрощений. Глобальная ошибка накапливается за весь процесс, её величина зависит от устойчивости метода. Для минимизации глобальной ошибки уменьшают шаг расчёта или используют методы с высокой точностью, такие как Рунге-Кутта. Метод Эйлера имеет линейную глобальную ошибку O(h), а метод Рунге-Кутты обеспечивает более точную O(h^p), где p — порядок метода. Контроль ошибок позволяет достичь высокой точности численных вычислений.

16. Метод центральной разности  
Метод центральной разности используется для численного вычисления производных с применением симметричной формулы f'(x) ≈ (f(x+h) - f(x-h)) / 2h. Он обладает точностью второго порядка O(h^2) и снижает систематические погрешности за счёт симметрии. В сравнении с методами прямой и обратной разности, центральная разность обеспечивает лучший баланс между простотой и точностью. Метод полезен в задачах численного решения дифференциальных уравнений и анализа данных. Он часто используется в моделировании физических процессов.

17. Метод Эйлера  
Метод Эйлера — это простой численный метод для решения задачи Коши: y'(x) = f(x, y), y(x0) = y0. На каждом шаге аппроксимация решения выполняется через линейную интерполяцию: y(n+1) = y(n) + h f(x(n), y(n)). Этот метод прост в реализации, но имеет высокую глобальную ошибку O(h) и недостаточно точен для сложных задач. Уменьшение шага h повышает точность, но увеличивает вычислительную нагрузку. Метод подходит для грубой оценки решений или задач с невысокими требованиями к точности.

18. Метод предиктора-корректора  
Метод предиктора-корректора включает два этапа. Сначала с помощью явного метода (предиктора) вычисляется предварительное значение:  
y(i+1)(0) = y(i) + (h / 24) * (55 * f(i) - 59 * f(i-1) + 37 * f(i-2) - 9 * f(i-3)).  
Затем используется неявный метод (корректор) для уточнения значения:  
y(i+1) = y(i) + (h / 24) * (9 * f(i+1) + 19 * f(i) - 5 * f(i-1) + f(i-2)).  
Этот подход объединяет простоту явных методов и устойчивость неявных, что делает его полезным для жёстких систем. Начальные значения (например, y(1), y(2), y(3)) обычно находятся методом Рунге-Кутты.

19. Метод Рунге-Кутты  
Метод Рунге-Кутты — это многошаговый численный метод решения ОДУ, который учитывает промежуточные оценки для повышения точности. Наиболее распространён четвёртый порядок, который включает расчёты наклонов k1, k2, k3, k4 и аппроксимацию: y(n+1) = y(n) + (h/6)(k1 + 2k2 + 2k3 + k4). Метод имеет высокую точность O(h^4) и широко используется в задачах, где требуется баланс между точностью и вычислительной сложностью. Он подходит для сложных моделей, например, в физике и инженерии. Рунге-Кутта обеспечивает более точные результаты, чем метод Эйлера, но требует больше вычислений.

20. Методы Адамса  
Методы Адамса делятся на явные (Бэшфорт) и неявные (Мултон) схемы, основанные на многошаговом подходе. Явные методы используют предыдущие точки для аппроксимации нового значения, например, y(n+1) = y(n) + (h/12)(23f(n) - 16f(n-1) + 5f(n-2)). Неявные схемы уточняют результат через текущее и новое значение, например, y(n+1) = y(n) + (h/12)(5f(n+1) + 8f(n) - f(n-1)). Явные методы проще, но менее стабильны, тогда как неявные подходят для жёстких задач. Такие методы часто применяются для моделирования с большим временным шагом.

21. МЕТОД МИЛНА  
Метод Милна – многошаговый метод предиктор-корректор для решения ОДУ.  
Предиктор (явная формула Адамса-Башфорта 4-го порядка):  
yₙ₊₁^p = yₙ + (h/24) [55fₙ - 59fₙ₋₁ + 37fₙ₋₂ - 9fₙ₋₃]  
Корректор (неявная формула Адамса-Мултона 4-го порядка):  
yₙ₊₁ = yₙ + (h/24) [9f(xₙ₊₁, yₙ₊₁) + 19fₙ - 5fₙ₋₁ + fₙ₋₂]  
Итерация корректора:  
yₙ₊₁^{new} = yₙ + (h/24) [9f(xₙ₊₁, yₙ₊₁^{new}) + 19fₙ - 5fₙ₋₁ + fₙ₋₂]  
Требует начальных значений y₀, y₁, y₂, y₃, полученных методом Рунге-Кутты 4-го порядка.

22. СОГЛАСОВАННОСТЬ, УСТОЙЧИВОСТЬ, СХОДИМОСТЬ  
Согласованность: Локальная погрешность τ = O(h^{p+1}), глобальная погрешность E = O(h^p).  
Устойчивость: Для уравнения y' = λy метод устойчив, если |ρ(z)| ≤ 1, где z = hλ и ρ – характеристический многочлен метода.  
Сходимость: Yₙ → y(tₙ) при h→0, если метод согласован и устойчив.  
Условия устойчивости: Например, для метода Рунге-Кутты 4-го порядка: |1 + hλ + (hλ)^2/2! + (hλ)^3/3! + (hλ)^4/4!| < 1 при Re(λ) < 0.

23. МОДЕЛИРОВАНИЕ ВОЛНЫ  
Волна описывается формулой s(t) = A⋅sin(ωt + φ).  
Амплитуда (A): Максимальное отклонение.  
Частота (f): f = ω / (2π).  
Период (T): T = 1/f.  
Длина волны (λ): λ = vT, где v – скорость распространения.  
Дискретизация: Шаг времени dt, частота дискретизации fₛ = 1/dt ≥ 2f (критерий Найквиста).  
Угловая частота (ω): ω = 2πf.  
При дискретизации: s[n] = A⋅sin(ωndt + φ).

24. ДИСКРЕТНОЕ ПРЕОБРАЗОВАНИЕ ФУРЬЕ (DFT)  
DFT: Xₖ = Σₙ=₀^{N-1} xₙ ⋅ e^(-j2πnk/N) для k=0,…,N-1.  
Обратное DFT (IDFT): xₙ = (1/N) Σₖ=₀^{N-1} Xₖ ⋅ e^(j2πnk/N) для n=0,…,N-1.  
Ограничения:  
- Сигнал xₙ предполагается периодическим с периодом N.  
- При f > fₛ/2 возникает aliasing.  
Симметрии: Для вещественных xₙ: Xₖ¯ = X_{N−k}. Для чётных xₙ Re(Xₖ) ≠ 0, Im(Xₖ) = 0; для нечётных xₙ Re(Xₖ) = 0, Im(Xₖ) ≠ 0.

25. БЫСТРОЕ ПРЕОБРАЗОВАНИЕ ФУРЬЕ (FFT)  
FFT алгоритм Кули-Тьюки: Разделяет DFT на DFT чётных и нечётных элементов:  
Xₖ = Σₙ=₀^{N/2-1} x_{2n} e^(-j4πnk/N) + e^(-j2πk/N) Σₙ=₀^{N/2-1} x_{2n+1} e^(-j4πnk/N)  
Сложность: O(N logN) вместо O(N²).  
Фильтрация:  
1. S = FFT(s[n]).  
2. S_filtered = Sₖ ⋅ Hₖ.  
3. s_filtered[n] = IDFT(S_filtered).  
Это позволяет выполнять свёртку: s_filtered = s * h за O(N logN).

26. ОПЕРАЦИЯ СВЁРТКИ  
Линейная свёртка: (f*g)[n] = Σₘ=0^{N-1} f[m] g[n−m].  
Циклическая свёртка: (f⊛g)[n] = Σₘ=0^{N-1} f[m] g[(n−m) mod N].  
Связь с Фурье:  
f*g ↔ F(f) ⋅ F(g).  
Алгоритм быстрой свёртки:  
1. F_f = FFT(f).  
2. F_g = FFT(g).  
3. F_fg = F_f ⋅ F_g.  
4. f*g = IDFT(F_fg).  
Замечание: Для линейной свёртки дополнить f и g нулями до длины ≥ N₁+N₂−1.

27. ДИСКРЕТНАЯ СВЁРТКА И ТЁПЛИЦЕВЫ МАТРИЦЫ  
Тёплицева матрица (Toeplitz): Aᵢⱼ = t_{i−j}.  
Пример для N=4:  
A = [[t₀ t_{-1} t_{-2} t_{-3}],  
     [t₁ t₀ t_{-1} t_{-2}],  
     [t₂ t₁ t₀ t_{-1}],  
     [t₃ t₂ t₁ t₀]]  
Умножение A×x: эквивалентно свёртке с ядром t.  
Оптимизация через FFT:  
(f * g) = IDFT(FFT(f) ⋅ FFT(g)), что снижает сложность до O(N logN).

28. ЦИРКУЛЯНТНЫЕ МАТРИЦЫ. МАТРИЦЫ ФУРЬЕ  
Циркулянтная матрица (C): C₍i,j₎ = c_{(i−j) mod N}.  
Пример для N=4:  
C = [[c₀ c₃ c₂ c₁],  
     [c₁ c₀ c₃ c₂],  
     [c₂ c₁ c₀ c₃],  
     [c₃ c₂ c₁ c₀]]  
Свойства:  
- Диагонализуется матрицей Фурьё F: C = F⁻¹ D F, где D – диагональная матрица с элементами Dₖ = FFT(c)[k].  
- Собственные векторы – столбцы F, собственные значения – DFT первого столбца C.  
Матрица Фурьё (F): Fₖℓ = e^(-j2πkℓ/N), k, ℓ=0,…,N-1.

29. БЫСТРЫЙ МАТВЕК С ЦИРКУЛЯНТОМ  
Умножение C×x:  
1. Y = FFT(x).  
2. Z = FFT(c) ⋅ Y.  
3. C×x = IDFT(Z).  
Алгоритмические шаги:  
- Вычислить Y = F×x, где F – матрица Фурьё.  
- Умножить поэлементно: Zₖ = Dₖ ⋅ Yₖ, где Dₖ = FFT(c)[k].  
- Получить результат: C×x = F⁻¹×Z.  
Сложность: O(N logN) вместо O(N²).  
Применение: Фильтрация сигналов, решение линейных систем с циклическими граничными условиями.
