Все задачи курса
Схема вычисления инвариантной функции
При решении задач из этого раздела необходимо указать
множества ,
и
, функцию
и преобразование
(см. определение инвариантной функции).
Должна быть объяснена программная реализация преобразования
и
доказана правильность построенной программы вида "S0;while(e)S;S1;".
Задача 11.25. Напишите программу, находящую наибольший общий делитель
двух целых неотрицательных чисел
и
, не равных одновременно нулю.
Воспользуйтесь следующими свойствами наибольшего общего делителя
(не забудьте научиться доказывать все
эти свойства):
,
,
,
,
.
Задача 11.26. Напишите программу, перемножающую два целых числа, одно из
которых неотрицательно, без использования операции умножения. Точные
пред- и постусловия требуемой программы, временная
сложность которой не должна превосходить , таковы:
,
. При написании программы величины
и
изменять не
разрешается. Воспользуйтесь тем, что
функция
,
является инвариантной
относительно преобразования
, задаваемого
формулой
![$$T(x,y,z)=\begin{cases}
(2x,y/2,z),& \text{если $y$ — четно},\\
(x,y-1,z+x), & \text{иначе}.
\end{cases}
$$](/sites/default/files/tex_cache/dd5ffe1f89e44927e60e7fdd3798145a.png)
Задача 11.27. Напишите программу, находящую наибольший общий делитель
двух целых неотрицательных чисел
и
, не равных одновременно нулю.
Воспользуйтесь следующим свойством наибольшего общего
делителя (докажите его!):
![gcd(x,y)=\begin{cases}
gcd(x\%y,y),& \text{если $x\geqslant y$},\\
gcd(x,y\%x),& \text{иначе}.
\end{cases}](/sites/default/files/tex_cache/1d0d21425d58febb6b969acafdabc6e0.png)
Здесь операция позволяет найти остаток от деления
на
.
Задача 11.28. Напишите программу, возводящую целое число в целую
неотрицательную степень. Точные
пред- и постусловия требуемой программы таковы: ,
.
При написании программы величины
и
изменять не
разрешается. Воспользуйтесь тем, что
функция
,
является инвариантной
относительно преобразования
, задаваемого
формулой
.
Задача 11.29. Напишите программу, находящую наибольший общий делитель
двух целых неотрицательных чисел
и
, не равных одновременно нулю.
Программа должна иметь временную сложность порядка
и не использовать операций деления и нахождения остатка от деления
(допустимо деление пополам, реализуемое с помощью операции сдвига).
Воспользуйтесь следующими свойствами наибольшего общего
делителя (докажите их!):
,
.
Указание
Воспользуйтесь инвариантностью функции относительно
следующего преобразования
:
![T(x,y,z)=\begin{cases}
(x/2,y/2,2z),& \text{если оба числа $x$ и $y$ — четны},\\
(x/2,y,z), & \text{если $x$ — четно, а $y$ — нечетно},\\
(x,y/2,z), & \text{если $x$ — нeчетно, а $y$ — четно},\\
(x-y,y,z), & \text{если $x$ и $y$ — нечетны и $x\geqslant y$},\\
(x,y-x,z), & \text{если $x$ и $y$ — нечетны и $x < y$}.
\end{cases}](/sites/default/files/tex_cache/d57aa0dbbf8ec1448f3ebfd1d870fcd0.png)
Не забудьте доказать -инвариантность функции
.
Задачи на индуктивные функции
При решении задач из этого раздела необходимо выяснить, является
ли индуктивной заданная функция . В случае ее индуктивности
следует предъявить отображение
, иначе нужно построить
индуктивное
расширение
исходной функции и предъявить
для
него. В последнем
случае нужно также указать отображение
и исследовать
построенное
расширение на минимальность (минимальность не является обязательным
условием). Завершить решение следует написанием
программы, реализующей однопроходный алгоритм, с указанием соответствия
между программными переменными и
обозначениями, использованными в теоретической части решения. Необходимо
объяснить, как в программе реализуется вычисление
или
на пустой
(или ее заменяющей) цепочке, как именно реализовано перевычисление
функции при удлинении цепочки, и как находится
в
случае использования индуктивного расширения.
Задача 11.30. Напишите программу, определяющую значение в целой точке
многочлена,
заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).
Задача 11.31. Напишите программу, вводящую последовательность целых чисел, и печатающую количество ее максимальных элементов.
Задача 11.32. Напишите программу, определяющую номер первого элемента, равного
, в
последовательности целых чисел. В том случае, если число
в
последовательности не встречается, положите
равным нулю.
Задача 11.33. Напишите программу, вводящую последовательность вещественных чисел, и печатающую среднее арифметическое ее элементов (для непустой последовательности).
Задача 11.34. Напишите программу, определяющую количество вхождений
образца в последовательность символов.
Задача 11.35. Напишите программу, определяющую количество минимальных элементов в последовательности неположительных целых чисел.
Указание В данном случае для доопределения индуктивного расширения на пустой цепочке нет необходимости использовать величины Integer.MIN_VALUE или Integer.MAX_VALUE.
Задача 11.36. Напишите программу, определяющую дисперсию не пустой последовательности
действительных чисел.
Дисперсией последовательности
называется
величина
, где
— среднее арифметическое
элементов последовательности.
Указание
Так как
![\begin{align*}
\displaystyle d = \frac{1}{n}\sum_{i=1}^n(x_i-m)^2=
\frac{1}{n}\sum_{i=1}^n(x_i^2-2mx_i +m^2)=\\
\frac{1}{n}\left(\sum_{i=1}^n x_i^2 -m \sum_{i=1}^n x_i -
m \sum_{i=1}^n (x_i-m)\right)=\\
\frac{1}{n}\left(\sum_{i=1}^n x_i^2 -m \sum_{i=1}^n x_i\right)=
\frac{1}{n}\sum_{i=1}^n x_i^2 -\frac{1}{n^2}\left(\sum_{i=1}^n x_i\right)^2,
\end{align*}](/sites/default/files/tex_cache/5b6f8db4761b3162bd69c9d02bb9967c.png)
то вводя обозначения ,
,
, получим
.
Легко проверить, что функция
является индуктивной.
Задача 11.37. Напишите программу, определяющую значение в целой точке
многочлена,
заданного последовательностью его целых коэффициентов (в порядке
возрастания степеней).
Задача 11.38. Напишите программу, определяющую значение в целой точке
производной многочлена,
заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).
Указание
Продифференцировав по равенство
и подставив затем
, получите
соотношения
и
, которые помогут построить
индуктивное расширение исходной функции.
Задача 11.39. Напишите программу, определяющую значение в целой точке
производной многочлена,
заданного последовательностью его целых коэффициентов (в порядке
возрастания степеней).
Задача 11.40. Напишите программу, определяющую значение в целой точке
второй производной многочлена,
заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).
Задача 11.41. Напишите программу, определяющую правильность формулы над
алфавитом из четырех символов . Формула считается правильной,
если она может быть получена с помощью следующей НФБН:
.
Указание
Рассмотрите следующее индуктивное расширение
функции
, где
,
,
, определены следующим образом:
может быть продолжена до правильной формулы,
= разность числа левых и правых скобок в
,
последний элемент
.
Задача 11.42. Напишите программу, определяющую номер последнего элемента, равного
,
в последовательности целых чисел. В том случае, если число
в
последовательности не встречается, положите
.
Задача 11.43. Напишите программу, определяющую число локальных максимумов в последовательности целых чисел. Элемент называется локальным максимумом, если у него нет соседа большего, чем он сам. Например, в любой одноэлементной последовательности всегда ровно один локальный максимум.
Задача 11.44. Напишите программу, определяющую среднюю длину связной возрастающей подпоследовательности в последовательности целых чисел.
Задача 11.45. Напишите программу (быстрое возведение в степень), возводящую целое число в целую неотрицательную степень
, временная
сложность которой не должна превосходить
.
Указание
Рассмотрите эту функцию , как функцию на пространстве последовательностей
над алфавитом
. В качестве последовательности
нужно
взять инвертированное представление числа
в двоичной системе счисления.
Данная последовательность получается естественным образом —
последняя цифра числа
есть "b&1", предпоследняя получается
по той же формуле после сдвига вправо ( "b>>>=1;" ) и так далее.
Индуктивное расширение
исходной функции
легко находится, что и
позволяет написать требуемую программу.
Задача 11.46.
Напишите программу, определяющую количество вхождений
образца в последовательность символов.
Задача 11.47.
Напишите программу, определяющую значение в целой точке
-ой производной многочлена,
заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).