Московский государственный индустриальный университет
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3331 / 379 | Оценка: 4.17 / 3.79 | Длительность: 24:17:00
Специальности: Программист
Дополнительный материал 1:

Все задачи курса

< Лекция 13 || Дополнительный материал 1: 1234567

Схема вычисления инвариантной функции

При решении задач из этого раздела необходимо указать множества X, Y и X_P, функцию F и преобразование T (см. определение инвариантной функции). Должна быть объяснена программная реализация преобразования T и доказана правильность построенной программы вида "S0;while(e)S;S1;".

Задача 11.25. Напишите программу, находящую наибольший общий делитель gcd(x,y) двух целых неотрицательных чисел x и y, не равных одновременно нулю. Воспользуйтесь следующими свойствами наибольшего общего делителя (не забудьте научиться доказывать все эти свойства):

gcd(x,y)=gcd(x,y-x)=gcd(x-y,y),

gcd(x,y)=gcd(x,y+x)=gcd(x+y,y),

gcd(x,x)=x, gcd(x,y)=gcd(y,x), gcd(x,0)=gcd(0,x)=x.

Задача 11.26. Напишите программу, перемножающую два целых числа, одно из которых неотрицательно, без использования операции умножения. Точные пред- и постусловия требуемой программы, временная сложность которой не должна превосходить \Theta(\log b), таковы: Q=(a\in \mathbb{Z}_M \land b\in \mathbb{Z}_M \land b \geqslant 0), R1=(z=ab). При написании программы величины a и b изменять не разрешается. Воспользуйтесь тем, что функция F\colon \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M
\rightarrow \mathbb{Z}_M, F(x,y,z) = z+xy является инвариантной относительно преобразования T\colon \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M
\rightarrow \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M, задаваемого формулой

$$T(x,y,z)=\begin{cases}
	(2x,y/2,z),& \text{если $y$ — четно},\\
	(x,y-1,z+x), & \text{иначе}.
	\end{cases}
$$

Задача 11.27. Напишите программу, находящую наибольший общий делитель gcd(x,y) двух целых неотрицательных чисел x и y, не равных одновременно нулю. Воспользуйтесь следующим свойством наибольшего общего делителя (докажите его!):

gcd(x,y)=\begin{cases}
	gcd(x\%y,y),& \text{если $x\geqslant y$},\\
	gcd(x,y\%x),&  \text{иначе}.
	\end{cases}

Здесь операция x\%y позволяет найти остаток от деления x на y.

Задача 11.28. Напишите программу, возводящую целое число в целую неотрицательную степень. Точные пред- и постусловия требуемой программы таковы: Q=(a\in \mathbb{Z}_M \land b\in \mathbb{Z}_M 
\land a > 0 \land b \geqslant 0), R1=(z=a^b). При написании программы величины a и b изменять не разрешается. Воспользуйтесь тем, что функция F\colon \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M
\rightarrow \mathbb{Z}_M, F(x,y,z) = zx^y является инвариантной относительно преобразования T\colon \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M
\rightarrow \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M, задаваемого формулой T(x,y,z)=(x,y-1,xz).

Задача 11.29. Напишите программу, находящую наибольший общий делитель gcd(x,y) двух целых неотрицательных чисел x и y, не равных одновременно нулю. Программа должна иметь временную сложность порядка \Theta(\log \max(x,y)) и не использовать операций деления и нахождения остатка от деления (допустимо деление пополам, реализуемое с помощью операции сдвига). Воспользуйтесь следующими свойствами наибольшего общего делителя (докажите их!):

gcd(2x,2y)=2gcd(x,y), gcd(2x, 2y+1)=gcd(x,2y+1).

Указание Воспользуйтесь инвариантностью функции F(x,y,z)=z\cdot gcd(x,y) относительно следующего преобразования T:

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}

Не забудьте доказать T -инвариантность функции F.

Задачи на индуктивные функции

При решении задач из этого раздела необходимо выяснить, является ли индуктивной заданная функция f. В случае ее индуктивности следует предъявить отображение G, иначе нужно построить индуктивное расширение F исходной функции и предъявить G для него. В последнем случае нужно также указать отображение \pi и исследовать построенное расширение на минимальность (минимальность не является обязательным условием). Завершить решение следует написанием программы, реализующей однопроходный алгоритм, с указанием соответствия между программными переменными и обозначениями, использованными в теоретической части решения. Необходимо объяснить, как в программе реализуется вычисление f или F на пустой (или ее заменяющей) цепочке, как именно реализовано перевычисление функции при удлинении цепочки, и как находится \pi(F(\omega)) в случае использования индуктивного расширения.

Задача 11.30. Напишите программу, определяющую значение в целой точке t многочлена, заданного последовательностью его целых коэффициентов (в порядке убывания степеней).

Задача 11.31. Напишите программу, вводящую последовательность целых чисел, и печатающую количество ее максимальных элементов.

Задача 11.32. Напишите программу, определяющую номер f первого элемента, равного x_0, в последовательности целых чисел. В том случае, если число x_0 в последовательности не встречается, положите f равным нулю.

Задача 11.33. Напишите программу, вводящую последовательность вещественных чисел, и печатающую среднее арифметическое ее элементов (для непустой последовательности).

Задача 11.34. Напишите программу, определяющую количество вхождений образца abcd в последовательность символов.

Задача 11.35. Напишите программу, определяющую количество минимальных элементов в последовательности неположительных целых чисел.

Указание В данном случае для доопределения индуктивного расширения на пустой цепочке нет необходимости использовать величины Integer.MIN_VALUE или Integer.MAX_VALUE.

Задача 11.36. Напишите программу, определяющую дисперсию не пустой последовательности действительных чисел. Дисперсией d последовательности x_1, x_2, \ldots, x_n называется величина \displaystyle \frac{1}{n}\sum_{i=1}^n(x_i-m)^2, где m=(x_1+x_2+\ldots+x_n)/n — среднее арифметическое элементов последовательности.

Указание

Так как

\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*}

то вводя обозначения \displaystyle s_0= \sum_{i=1}^n 1 = n, \displaystyle s_1= \sum_{i=1}^n x_i, \displaystyle s_2= \sum_{i=1}^n x_i^2, получим \displaystyle d=s_2/s_0 - (s_1/s_0)^2. Легко проверить, что функция F = (s_2, s_1, s_0) является индуктивной.

Задача 11.37. Напишите программу, определяющую значение в целой точке t многочлена, заданного последовательностью его целых коэффициентов (в порядке возрастания степеней).

Задача 11.38. Напишите программу, определяющую значение в целой точке t производной многочлена, заданного последовательностью его целых коэффициентов (в порядке убывания степеней).

Указание Продифференцировав по x равенство P_n(x) = x \cdot P_{n-1}(x) + a_n и подставив затем x=t, получите соотношения P'_0(t) = 0 и P'_n(t) = t \cdot P'_{n-1}(t) + P_{n-1}(t), которые помогут построить индуктивное расширение исходной функции.

Задача 11.39. Напишите программу, определяющую значение в целой точке t производной многочлена, заданного последовательностью его целых коэффициентов (в порядке возрастания степеней).

Задача 11.40. Напишите программу, определяющую значение в целой точке t второй производной многочлена, заданного последовательностью его целых коэффициентов (в порядке убывания степеней).

Задача 11.41. Напишите программу, определяющую правильность формулы над алфавитом из четырех символов X=\{(,),t,+\}. Формула считается правильной, если она может быть получена с помощью следующей НФБН: e \rightarrow t \mid (e + e).

Указание Рассмотрите следующее индуктивное расширение F=(f_1, f_2, f_3) функции f, где f_1\colon X^* \rightarrow \{T,F\}, f_2\colon X^* \rightarrow \mathbb{Z}_M, f_3\colon X^* \rightarrow X, определены следующим образом:

f_1(\omega) = \omega может быть продолжена до правильной формулы,

$f_2(\omega) = разность числа левых и правых скобок в \omega,

$f_3(\omega) = последний элемент \omega.

Задача 11.42. Напишите программу, определяющую номер f последнего элемента, равного x_0, в последовательности целых чисел. В том случае, если число x_0 в последовательности не встречается, положите f=0.

Задача 11.43. Напишите программу, определяющую число локальных максимумов в последовательности целых чисел. Элемент называется локальным максимумом, если у него нет соседа большего, чем он сам. Например, в любой одноэлементной последовательности всегда ровно один локальный максимум.

Задача 11.44. Напишите программу, определяющую среднюю длину связной возрастающей подпоследовательности в последовательности целых чисел.

Задача 11.45. Напишите программу (быстрое возведение в степень), возводящую целое число a в целую неотрицательную степень b, временная сложность которой не должна превосходить \Theta(\log b).

Указание Рассмотрите эту функцию f, как функцию на пространстве последовательностей над алфавитом \{0,1\}. В качестве последовательности \omega нужно взять инвертированное представление числа b в двоичной системе счисления. Данная последовательность получается естественным образом — последняя цифра числа b есть "b&1", предпоследняя получается по той же формуле после сдвига вправо ( "b>>>=1;" ) и так далее. Индуктивное расширение F исходной функции f легко находится, что и позволяет написать требуемую программу.

Задача 11.46. Напишите программу, определяющую количество вхождений образца abab в последовательность символов.

Задача 11.47. Напишите программу, определяющую значение в целой точке t k -ой производной многочлена, заданного последовательностью его целых коэффициентов (в порядке убывания степеней).

< Лекция 13 || Дополнительный материал 1: 1234567
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева