- •Глава 1
- •Свойства алгоритмов
- •Примитивно–рекурсивные функции
- •Оператор минимизации
- •Ограниченный оператор минимизации
- •Частично–рекурсивные функции и тезис Черча
- •Контрольные вопросы к разделу
- •Упражнения к разделу
- •Задача 1
- •Варианты заданий
- •Задача 2
- •Варианты заданий
- •Тесты для самоконтроля к разделу
Варианты заданий
1. f (x, y) = [log2((x + 1) · (yy+2x) + 2x] + 2 + [√y] .
2. f (x, y) = [x√3] + [ 1+x+√y xy + 2x] + 22x+y2 .
...2y+2
3. f (x, y) = xyy+1 .
...2y+3
4. f (x, y) = x(y+1)(y+2) .
5. f (x) = [(x2 + x)√4 + x3 + 2x] + [√5 x3 + 2x + 1] + 82x+2.
2x+3
6. f (x) =
∑ [√xi + 3i + ix + √2x + 2 + i] .
i=1
y+2
7. f (x, y, z) = [log2y+x+1((y + 3)(y+2·x)!)] + { x }.
8. f (x, y, z) = {x 3 } + [ 1+x+y xy + 2zy2] + 22x+z .
√ √ 2
3
9. f (x, y) = [x√4 + x2] + [√5 xy + 2x + 1] + 82x+y3 .
10. f (x, y, z) = [(z2 + y)√4 + x3 + 2x = z4] + [√3 xz + 2x + 1] .
11. f (x, y) = [log5(yy+2·x) + x!] + [√x] + [√y] .
xx+4
i 3
{ }.
12. f (x) =∑ x+2 +i
4x+1+i
i=0
2x+3
13. f (x, y) =
∏ [√xi + 2i + 2y + √3y + i] .
i=1
14. f (x, y, z) =
x+z
∏
iy
√ √
∑ [ i + 2j + 2z+x+ij + 3j + i] .i=0 j=0
15. f (x) = [(x2 + y)√4 + x3 + 2x] + [√5 x3 + 2x + 1] + 82x+2.
16. f (x) = [5x√2] + [ x+√2 x + 2x4] + 22x+2.
y3+3
17. f (x, y) = [1 + log3(52y+2+x) + 2x] + { x+y }.18. f (x, y) = [xy√x2 + y2] + [ 1+√x xy + 2x] + x2+y.
19. f (x) =
2x+3
∑
i=0
[xi+3i+ix ] 2x+2+i
y2+2x
.
20. f (x, y) = [lg(y(y + 2x+y+2)) + 2x] + { x }.
Задача 2
Доказать примитивную рекурсивность функции p(x) – простое число с номером
x. В соответствии с доказательством написать программу вычисления этой функции.
Решение. Рассмотрим сначала вспомогательную функцию h(x), равную числу делителей числа x. Очевидная формула
x
h(x) = ∑(sg({x/i})),
i=1
(где выражение {x/i} означает остаток от деления x на i ) доказывает примитивную рекурсивность функции h(x), являющейся суперпозицией примитивно-рекурсивных функций. Простые числа и только они имеют ровно два делителя — единицу и самого себя. Числа 0 и 1 простыми не являются. Все числа, не являющиеся простыми, кроме 0 и 1, имеют число делителей, большее двух. Тогда характеристическая функция χp(x) предиката ⟨x — простое число при x > 1⟩ равна
χp(x) = sg(h(x)−˙ 2)
и является примитивно–рекурсивной.
Одной из наиболее известных арифметических функций является функция π(x), равная числу простых чисел, не превосходящих x. Используя уже известную нам примитивно–рекурсивную функцию χp(x), получим
x
π(x) = ∑(χp(i).
i=1
Отсюда следует, что искомая функция p(x) – простое число с номером x – представ- ляет собой минимальное решение уравнения
π(z) = x.
Таким образом,
p(x) = µz (π(z) = x).
Для доказательства примитивной рекурсивности функции p(x) достаточно ввести верхнюю границу изменения z и доказать примитивную рекурсивность как этой гра- ницы, так и характеристической функции предиката p(x) = x. Последнее легко сде- лать, т.к. эта функция равна
sg((π(z)−˙ x) + (x−˙ π(z))).
Осталось рассмотреть границу изменения z. Из теории чисел хорошо известно, что
n
pn < 22 . В самом деле, требующееся нам неравенство заведомо истинно при n = 0.
По индукции далее предполагаем, что это неравенство истинно для всех значений n, докажем его для n + 1.
0
По предположению имеем
Тогда
p0 < 22 ,
1
p1 < 22 ,. . .
n
pn < 22 .
0 1 n
0 1 n
n+1
p0 · p1 · ... · pn + 1 < 22
· 22
· ... · 22
+ 1 = 22 +2 +...+2
+ 1 < 22 .
Число a = p0 · p1 · ... · pn + 1 больше единицы и поэтому должно иметь какой-то про- стой делитель pr. Этот делитель не может совпадать ни с одним из простых чисел p0, p1, ...pn, так как при делении числа a на любое из чисел p0, p1, ...pn получается остаток 1. Но все простые числа, не превосходящие pn, содержатся в последователь- ности p0 , p1 , ... pn. Число pr в нее не входит и, следовательно, pn+1 ≤ pr. Так как pr ≤ a, то
что и требовалось доказать.
pn+1 ≤ a < 22
n+1
,
Итак, неравенство доказано, а вместе с ним доказана и примитивная рекурсив- ность функции p(x), имеющей своим значением простое число с номером x.
Напишем теперь программу вычисления этой функции, соответствующую постро- енному доказательству. Сразу отметим, что доказательство примитивной рекурсив- ности функции не ставит своей целью построение алгоритма, обладающего хорошими временными характеристиками. Такое доказательство обосновывает лишь существо- вание алгоритма решения поставленной задачи, причем свойство определенности всюду для примитивно–рекурсивных функций означает, что для любых исходных данных соответствующая программа получит результат через некоторое конечное (может быть, очень большое ) время.
Приведенному выше доказательству соответствует следующая программа.
#include <stdio.h>
#include <STDLIB.H>
int sg(int x) { return x>0; }
int h(long int x)
{
long int i; int s=0;
for (i=1; i<=x;
i++
)
i);
return
s;
}
int Xi(long int x)
{
if (x==1) return 1; if (x==0) return 0; return 1-sg(h(x)-2);
}
long int Pi( long int x)
{
long int i,s=0;
for (i=1; i<=x; i++ )s+=Xi(i); return s;
}
long int p( long int x)
{
long int z=0;
while (Pi(z)!=x) z++; return z;
}
void main(void)
{
int x; d",&x); unsigned long int z=p(x);
printf("простое число с номером d равно ld\n",x,z);
}
Следует отметить, что мы доказали алгоритм для любого x ∈ N . Однако, огра- ничение разрядной сетки компьютера не позволяет на уровне команд выполнить операции над сколь угодно большими числами. В нашей программе мы ограничили получаемые значения типом long int. Если программа должна работать с большими числами, необходимо реализовать так называемую длинную арифметику.
