ЗАДАЧИ ДЛЯ ЗАЧЕТА ВО ВТОРОМ СЕМЕСТРЕ
            ------------------------------------
   Перед задачами в скобках обозначена их трудность по 10-баль╨
ной шкале.  0  этой шкалы соответствует задаче типа "напечатать
слово "ура" на терминале", а 10 баллов - задаче типа "доказать,
что не существует натуральных x,y,z, n>2: x**n + y**n = z**n".

                  Несложные численные методы
                  --------------------------
(3) Найти корни  первых  30  полиномов  Лежандра:
Ln = Dn( (x**2-1)**n ), с точностью 1e-6.

(3) Зная коэффициенты многочленов Е(X,Y), F(X,Y), G(X,Y), найти
коэффициенты E(F(X,Y),G(X,Y)).

   В следующих задачах не должны использоваться соответствующие
встроенные функции фортрана (кроме как в целях контроля).  Точ╨
ность результата должна быть не хуже 1Е-5. Время, затрачиваемое
на вычисление не должно превышать одной секунды.

(2) Вычислить LN(T) ДЛЯ 10**(-37)<T<10**(37).
(2) Вычислить ATAN(T) ДЛЯ 10**(-37)<T<10**(37).
(2) Вычислить ASIN(T) ДЛЯ -1<T<1.

(4) Извлечь квадратный корень из матрицы 2*2,  т.е.  найти  все
такие матрицы X, что X*X=A.

(2) Найти все (в том числе  и  комплексные)  корни  кубического
уравнения с вещественными коэффициентами с  абсолютной  погреш╨
ностью не хуже 1Е-5.

(2) Вычислить exp(а), где а - комплексная n*n матрица.

(2) Дан многочлен А с ненулевым свободным членом. Найти  первые
n коэффициентов разложения 1/A в ряд Тейлора в нуле.

(2) Вычислить минимум Гамма-функции

(2) Вычислить приближенное значение  пи, используя  метод  Мон╨
те-Карло для вычисления интеграла от 0 до 2 sqrt(4.-x**2) dx.

(4) В очень большой прямоугольной сетке  из  одинаковых  сопро╨
тивлений к концам одного из них присоединили батарейку с напря╨
жением 1В. Найти распределение напряжений в  окрестности  этого
сопротивления.

(3) Считая, что значения одного и того же многочлена вычисляют╨
ся много раз для различных значений, уменьшите количество необ╨
ходимых для этого умножений по сравнению с методом Горнера (ум╨
ножение на многих ЭВМ выполняется сравнительно медленно).

               Арифметика произвольной точности
               --------------------------------
(3) Найти первые 1000 знаков десятичной записи чисел "Пи", "Е"

(3) Найти первые 1000 знаков десятичной записи "Золотого  сече╨
ния" (1.+sqrt(5.))/2.

(3) Найти первые 1000 знаков десятичной записи sin(1) и cos(1).

(3) Определить первые два десятичных знака числа SIN(10**30).

2.

(2) Вычислить точно 100!

(2) Вычислить десятичное разложение  1000-го  члена  последова╨
тельности Фибоначчи.

(3) Найти два тысячезначных натуральных числа,  последние  1000
цифр квадратов которых совпадали бы с самими числами.

(3) Доказать, что для любого k найдется n, такое что в десятич╨
ной записи 2**n встречается подряд k нулей. Найти наименьшие  n
для 1 <= к <= 7.

(5) Эйлер в 1769 году выдвинул гипотезу, что не существует  це╨
лых положительных чисел, удовлетворяющих условию: a**5 + b**5 +
c**5 + d**5 = e**5. Опровергните эту гипотезу.

                 Разреженные векторы и матрицы
                 -----------------------------
(4) Создать исполнитель для работы  с  вещественными  матрицами
размером 1000 x 1000, содержащими не более 1000 ненулевых  эле╨
ментов на базе двух целых и одного вещественного векторов длины
1000. В него должны входить предписания  для  сложения  матриц,
умножения матрицы на число и т.д.

(3) Создать исполнитель для работы  с  вещественными  векторами
размером 32000, содержащими не более 1000  ненулевых  элементов
на базе целого и одного вещественного векторов  длины  1000.  В
него должны входить предписания для сложения векторов,  умноже╨
ния вектора на число и т.д.

                          Компиляция
                          ----------
(4) Составить программу проверки  правильности  арифметического
выражения фортрана. Облегчение:  можно  исключить  вещественные
константы (4 баллa).

(3) Составить программу вычисления арифметического выражения из
целых констант и знаков со скобочной структурой.

(2) Составить программу, которая по двум данным  степеням  мно╨
гочленов  порождает  линейную  (без  циклов)  подпрограмму   на
фортране для умножения этих многочленов.

(3) Формула содержит односимвольные переменные, знаки + - * / и
круглые скобки. Перевести ее в префиксную форму записи:

        A*(B+C)-D       -->     -*A+BCD

(4) Дана правильная формула, содержащая односимвольные перемен╨
ные, знаки + - * /, круглые скобки. Выбросить максимальное  ко╨
личество пар скобок так, чтобы смысл формулы не изменился.

(4) Дана правильная формула, содержащая односимвольные перемен╨
ные, знаки + - * /, круглые скобки. Добавить минимальное  число
пар скобок так, чтобы смысл формулы не зависел  от  приоритетов
операций.

                                                             3.

(5) Язык включает в себя оператор присваивания =, знаки  опера╨
ций +, -, *, /, переменные A..Z,  круглые  скобки.  Реализовать
компилятор с этого простейшего языка в ассемблер PDP-11.

    Пример                              mov     C,  r1
    результата      A=B*(C+D)   -->     add     D,  r1
    компиляции:                         mul     B,  r1
                                        mov     r1, A

(5) Логическое выражение состоит из  знаков  операций  !("не"),
&("и"), |("или"), односимвольных логических переменных  A..Z  и
круглых скобок. Реализовать компилятор, переводящий его в прог╨
рамму на ассемблере PDP-11. Результат (0 или  1)  должен  поме╨
щаться в регистр r0. Выражение должно вычисляться "сокращенно":
если в выражении a&b а=0, не надо вычислять b, аналогично в a|b
не надо вычислять b, если a!=1.
                                                clr     R0
    Пример                                      tst     A
    результата      А & ( B | !C ) -->          beq     L0
    компиляции:                                 tst     B
                                                bne     L1
                                                tst     C
                                                bne     L0
                                          L1:   inc     R1
                                          L0:

               Разные задачи по программированию
               ---------------------------------
(2) Напечатать перестановки порядка n в лексикографическом  по╨
рядке.

(3) Напечатать перестановки чисел от 1 до n так,  чтобы  каждая
пара соседних перестановок отличалась одной  транспозицией  со╨
седних элементов.

(4) Определить, можно  ли  расстановкой  знаков  арифметических
операций и скобок между некоторыми цифрами шестизначного номера
автобусного билета получить число 100. Примеры:  номер  123456,
100 = (-1)*2+(3*4+5)*6; номер 654321, 100 = 65+4+32-1. Програм╨
ма должна напечатать формулу (как в приведенных  примерах).  Не
обязательно, чтобы программа всегда находила формулу,  требует╨
ся, чтобы она не очень сильно проигрывала человеку  по  времени
поиска.

(2) Найти все числа, равные сумме факториалов своих цифр.

(3) Найти все числа, равные сумме n-ных степеней своих цифр для
n от 1 до 10

(4) Отсортировать по возрастанию 5000 вещественных чисел, почти
равномерно распределенных в диапазоне 0..1 за время менее 1 ми╨
нуты методом отличным от QuickSort или HeapSort.

(2) Пусть p - m*n матрица с элементами типа "да/нет". Известно,
что множество элементов, равных "да", есть объединение  непере╨
секающихся прямоугольников. Найти число прямоугольников и число
тех из них, которые являются квадратами.

4.

(5) Из четырех одинаковых кубиков можно собрать 6 разных  непа╨
раллелепипедов, из трех - еще один. Сколькими различными спосо╨
бами можно собрать куб из этих 7 деталей?

(2) Перечислить все  способы  расстановки  скобок  в  неассоци╨
ативном произведении n сомножителей

(2) Перечислить все возможные разбиения  множества  1..N  на  K
частей.

(2) Напечатать все возможные разбиения числа N на сумму  слага╨
емых.

(3) Напечатать все последовательности цифр 0,1,2 длины n, в ко╨
торые ни одна группа цифр не входит два раза подряд

(2) Отображение целочисленного отрезка в  себя  задано  в  виде
функции y=f(x). Найти минимальный период этого отображения.

                             Графы
                             -----
(2) Найти число связных компонент графа.

(2) Пусть с каждым ребром графа связано число - его длина. Сос╨
тавить программу для определения кратчайшего пути  между  двумя
заданными вершинами графа.

(2) Найти в графе кратчайший путь, состоящий ровно из l ребер.

(2) Составить программу для определения наличия циклов в графе.

(3) Дано множество кругов на плоскости, их объединение  связно.
Для кругов a, b найти цепочку a=a1,a2,...,an=b  такую,  что  ai
пересекается с ai+1 для i из 1..n-1 и такую, что сумма  квадра╨
тов площадей пересечения минимальна.

                       Обработка текстов
                       -----------------
(4) Написать программу на Фортране (или на Си), которая печата╨
ет свой собственный текст. Операторами ввода или  трюками  типа
"call  system('type  program.f')"  пользоваться,   естественно,
нельзя. (Наилучшее известное решение содержит 5 строчек).

(2) Найти в файле все слова, отличающиеся от заданного  заменой
одной буквы, пропуском, вставкой буквы или  перестановкой  двух
соседних букв (типичные опечатки).

(3) В векторе из символов найти отрезок-палиндром  максимальной
длины (палиндром - текст, который одинаково читается в прямом и
обратном направлении).

(2) Подсчитать число слов, букв и  строчек  в  текстовом  файле
(слова могут быть разделены пробелами и знаками  препинания,  и
соединены знаками переноса ("-" в конце строки).

(3) Напечатать 100 наиболее  часто  встречающихся  в  текстовом
файле слов вместе с числом их появлений.

                                                            5.

(4) Отсортировать строчки текстового файла в лексикографическом
порядке. Файл может быть довольно большим  и не  поместиться  в
память целиком.

(2)  Дано целое 0 <= N <= 10**6. Напечатать по-русски фразу  "N
ворон". Например, "миллион ворон" или "двести сорок три  тысячи
семьсот пятьдесят одна ворона".

(3) Разбить слово русского языка на "слоги", в местах пригодных
для переноса. Эвристические правила: слово можно  переносить  в
следующих местах: г-г, гс-сг, сг-сг, а также после й,ь.  Нельзя
переносить одну букву, с обеих сторон от знака переноса  должны
встречаться гласные. Например:  прог-рам-ми-ро-ва-ние. Попытай╨
тесь улучшить эти правила (5 баллов).

(3) Напишите программу для форматирования абзацев текста. Абза╨
цы отделяются друг от друга пустыми строчками. Слова в отформа╨
тированном абзаце должны  размещаться  возможно  более  плотно,
правый край должен быть выровнен. Первая строка  абзаца  должна
быть с отступом.

(3) Шаблон -  строка  обычных  символов,  среди  которых  могут
встречаться "*", обозначающая последовательность (в том числе и
пустую) любых символов и "?", обозначающий один  любой  символ.
Напечатать все строчки файла, в которых встречаются слова, под╨
ходящие под заданный шаблон.

(5) Даны два немного различающихся текстовых  файла  (например,
оба получены из одного оригинала некоторым количеством вставок,
удалений или замен строчек). Получить их объединение,  с  отме╨
ченными различиями. Разметка должна быть такого вида:

                совпадающий текст
        <<<1>>>
                вариант первого файла
        <<<2>>>
                вариант второго файла
        <<<*>>>
                совпадающий текст

                ...
                           Геометрия
                           ---------
(4) Найти выпуклую оболочку n окружностей ненулевого радиуса.

(4) Найти выпуклую оболочку N точек за O(N*log(N)) операций.

(3) Найти диаметр выпуклого многоугольника за О(N) операций.

(4) Нарисовать вид поверхности  z=f(x,y)  (точнее  координатной
сетки x=const, y=const на ней) из точки (x0,y0,z0) с "удалением
невидимых линий".

(2) Нарисовать линии уровня функции z=f(x,y)

(2) Нарисовать кривую Пеано.

(2) Нарисовать двумерное Канторово множество.

6.

(3) Даны k отрезков на прямой. Найти максимальное n, для  кото╨
рого существует точка, принадлежащая одновременно n отрезкам за
время меньшее O(k**2).
                            Алгебра
                            -------
(2) Сколько из первых 1000 чисел вида (p**2-2), где  p-простое,
являются составными?

(2) Проверить положительную определенность  квадратичной  формы

(2) Найти собственные числа и собственные векторы матрицы (2*2)

(3) Линейным преобразованием привести квадратичную форму к  ка╨
ноническому виду. (Найти  матрицу  преобразования  и  сигнатуру
формы).

(4) Найти число вещественных корней полинома на заданном отрез╨
ке (используя, например, теорему Штурма).

(3) Найти все неприводимые над полем Z(p) многочлены степени  n
(n небольшое).

(5) Реализовать асимптотически быстрый способ умножения матриц,
основанный на следующем тождестве, с помощью которого умножение
матриц размера 2*k производится с помощью  7  умножений  матриц
размера k, что дает сложность k**log2(7) (алгоритм Штрассена):

 ─┬┬│─┬┬│ ─┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│
 ┴ab┴┴AB┴=┴(a+d)(A-D)+(b+d)(C+D)-d(A+C)+(a-b)D   a(D+B)-(a-b)D┴
 ┴cd┴┴CD┴ ┴d(A+C)-(d-c)A   (a+c)(B+A)-(a+d)(A-D)-a(D+B)+(d-c)A┴
 ┌┬┬┐┌┬┬┐ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐

(3) Пусть F:A->A отображает множество А из N элементов в  себя.
Найти S - максимальное подмножество A - такое, что сужение F на
S взаимно однозначно. (Можно считать, что A -  множество  целых
чисел от 1 до N; F - вектор  элементов  типа  1..N  с  индексом
1..N). Время работы программы не должно быть больше O(N).

(4) Теорема Ван дер Вардена утверждает, что при любой раскраске
целочисленной оси координат в два цвета существуют  одноцветные
арифметические прогрессии любой длины. Для  небольших  K  найти
наименьшее N такое, что при любой раскраске отрезка длины N су╨
шествует одноцветная арифметическая прогрессия длины K.

(5) Напечатать все неизоморфные полугруппы из 4 элементов

(5) Код Грэя степени 4 - перестановка  4-разрядных  слов  0000,
0001, 0010, ..., 1111 такая, что два соседних слова  (первое  и
последнее также считаются соседями) отличаются только одним би╨
том. Два кода считаются эквивалентными, если один  можно  полу╨
чить из другого размещением слов в обратном порядке,  цикличес╨
ким сдвигом последовательности,  инверсией  некоторого  подмно╨
жества битов и перестановкой битов. Найти число неэквивалентных
кодов порядка 4.

(3) "Китайская теорема об остатках". Дано k взаимно простых чи╨
сел m[i]. Найти число, меньшее произведения m[i], если известны
остатки от деления его на все m[i].

                                                             7.

(3) Число m называется кармайкловым, если для  всех  b  взаимно
простых с m выполняется mod(b**(m-1)-1,m) = 0 (т.е. число ведет
себя как простое в малой теореме Ферма) Найти  все  кармайкловы
числа в диапазоне 1..32767

(5) Определить, является ли 30-50-значное число простым  с  по╨
мощью следующего вероятностного  теста  (далее  все  вычисления
ведуться в кольце вычетов Z/pZ):
   выбрать случайноe число a в диапазоне 2..p,
   если НОД(p,a)!=1 или a**(p-1)!= 1, то p - составное;
   иначе пусть  (p-1)=q*2**k, где q - нечетно;
   рассмотрим последовательность
         a**q, a**(2*q), a**(4*q)..., a**(p-1) = 1
   если в ней существует фрагмент ...x, 1,... и x != +-1,
   то p - составное,
   иначе p - выдержало тест на простоту для данного а.
Если p - составное, то оно не проходит тест по крайней мере для
3/4 значений a в диапазоне 1..p; выполнив тест для k  различных
a, можно надеятся, что p - простое с вероятностью 1-0.25**k.

(4) Разложить 20-значное число на множители методом Монте-Карло.

(6) Разложить 20-значное число на множители методом  квадратич-
ного решета.
                            Шахматы
                            -------
(4) Сколько ферзей (коней) достаточно расставить  на  шахматной
доске так, чтобы каждая клетка доски находилась под боем? Найти
все расстановки.

(3) Составить программу для определения числа расстановок  фер╨
зей на шахматной доске, так что ни один из них не бьет другого.
(Симметричные решения считать один раз)

(3) Составить программу для обхода шахматной доски ходом  коня,
начиная с произвольного поля. Конь должен  побывать  на  каждом
поле ровно по одному разу. Указание:  существует  эвристический
алгоритм - ходить каждый раз на то поле, с которого можно  уйти
меньшим число ходов. Всегда ли он работает?

                            Разное
                            ------
(4) Реализовать редактор шрифта для а/ц-терминала "Грамм".  Его
функции должны включать редактирование  изображения  отдельного
знака, сохранение, восстановления всего шрифта в файле, загруз╨
ку шрифта в терминал.

(3) Реализовать игру "Реверси" (известную также  под  названием
"Отелло"). Играют два человека, программа только  рисует  поле,
переворачивает фишки, проверяет правильность ходов и  подсчиты╨
вает очки. Развитие темы: программа не слишком бездарно  играет
за одного игрока (6 баллов).

(3) Реализовать игру НИМ: имеется 3 (или  N)  кучи  камней,  за
один ход игрок может взять любое количество камней из какой-ни╨
будь одной кучи. Выигрывает тот, кто  берет  последний  камень.
Программа должна выигрывать в выигрышных позициях.

(6) Реализовать игру Калах (программа должна выигрывать  у  но╨
вичка).
                   - Конец списка задач -