- Задача — Доказательство гипотезы Сиракуз
— программирование на Pascal, Си, Кумир, Basic-256, Python
Задача — Доказательство гипотезы Сиракуз — программирование на Pascal, Си, Кумир, Basic-256, Python
Доказать гипотезу Сиракуз на диапазоне чисел. Гипотеза Сиракуз утверждает, что любое натуральное число сводится к единице в результате повторения следующих действий над самим числом и результатами этих действий.
- Если число четное следует разделить его на 2.
- Если нечетное, то умножить его на 3, прибавить 1 и разделить на 2.
- Запросить нижнюю и верхнюю границы диапазона чисел.
- Последовательно перебрать все числа от нижней до верхней границы включительно.
- Вывести на экран само число.
- Повторять до тех пор, пока число не будет сведено к единице:
- если число четное, то разделить его на 2,
- иначе умножить на 3, прибавить 1 и разделить на 2,
- вывести полученное значение на экран.
Если гипотеза Сиракуз верна, то программа рано или поздно завершится и зацикливания не произойдет, т.к. все числа будут сведены к единице.
var
n, i, a, b: word;
begin
readln(a,b);
for i:=a to b do begin
n := i;
write(‘-> ‘, n, ‘ ‘);
while n <> 1 do begin
if (n mod 2) = 0 then
n := n div 2
else
n := (3*n + 1) div 2;
write(n,’ ‘);
end;
writeln;
end;
end. 10
14
-> 10 5 8 4 2 1
-> 11 17 26 13 20 10 5 8 4 2 1
-> 12 6 3 5 8 4 2 1
-> 13 20 10 5 8 4 2 1
-> 14 7 11 17 26 13 20 10 5 8 4 2 1
а = int(input())
б = int(input())
в то время как a<=b:
п = а
print(‘-> ‘,n, end=’ ‘)
пока n != 1:
если n%2 == 0:
п = п // 2
еще:
n = (n*3 + 1) // 2
print(n, end=’ ‘)
печать()
а += 1 1533
1537
-> 1533 2300 1150 575 863 1295 1943 2915 4373 6560 3280 1640 820 410 205 308 154
77 116 58 29 44 22 11 17 26 13 20 10 5 8 4 2 1
-> 1534 767 1151 1727 2591 3887 5831 8747 13121 19682 9841 14762 7381 11072 5536
2768 1384 692 346 173 260 130 65 98 49 74 37 56 28 14 7 11 17 26 13 20 10 5 8 4 2
1
-> 1535 2303 3455 5183 7775 11663 17495 26243 39365 59048 29524 14762 7381 11072
5536 2768 1384 692 346 173 260 130 65 98 49 74 37 56 28 14 7 11 17 26 13 20 10 5 8
4 2 1
-> 1536 768 384 192 96 48 24 12 6 3 5 8 4 2 1
-> 1537 2306 1153 1730 865 1298 649 974 487 731 1097 1646 823 1235 1853 2780 1390
695 1043 1565 2348 1174 587 881 1322 661 992 496 248 124 62 31 47 71 107 161 242
121 182 91 137 206 103 155 233 350 175 263 395 593 890 445 668 334 167 251 377 566
283 425 638 319 479 719 1079 1619 2429 3644 1822 911 1367 2051 3077 4616 2308 1154
577 866 433 650 325 488 244 122 61 92 46 23 35 53 80 40 20 10 5 8 4 2 1
алг гипотеза Сиракуз
нач
цел н,и,а,б
вводы а,б
нц для i от a до b
п := я
вывод «-> «,n,» »
нц пока n 1
если mod(n,2) = 0 то
п := дел(n,2)
иначе
n := div(n*3+1,2)
все
вывод n, » »
кц
выводы нс
кц
кон 3 10
-> 3 5 8 4 2 1
-> 4 2 1
-> 5 8 4 2 1
-> 6 3 5 8 4 2 1
-> 7 11 17 26 13 20 10 5 8 4 2 1
-> 8 4 2 1
-> 9 14 7 11 17 26 13 20 10 5 8 4 2 1
-> 10 5 8 4 2 1
введите
вход б
для i = от a до b
п = я
напечатайте «-> » + n + » «;
в то время как n 1
если n%2 = 0, то
п = п2
еще
п = (3*n + 1) 2
эндиф
напечатайте n + » «;
в конце
распечатать «»
следующий мне 31
36
-> 31 47 71 107 161 242 121 182 91 137 206 103 155 233 350 175 263 395 593 890
445 668 334 167 251 377 566 283 425 638 319 479 719 1079 1619 2429 3644 1822
911 1367 2051 3077 4616 2308 1154 577 866 433 650 325 488 244 122 61 92 46 23
35 53 80 40 20 10 5 8 4 2 1
-> 32 16 8 4 2 1
-> 33 50 25 38 19 29 44 22 11 17 26 13 20 10 5 8 4 2 1
-> 34 17 26 13 20 10 5 8 4 2 1
-> 35 53 80 40 20 10 5 8 4 2 1
-> 36 18 9 14 7 11 17 26 13 20 10 5 8 4 2 1
Вы нашли apk для андроида? Вы можете найти новые бесплатные игры для Android
и приложения.
Гипотеза Коллатца. Взгляд со стороны двойной системы вычислений
Дело было вечером, делать было нечего. Листал Ленту, увидев упоминание гипотезы Колатца, загуглил, заинтересовался своей простотой (как и все), решил поразвлекаться.
Мне ближе информатика и программирование, поэтому я решил зайти со стороны двойной системы вычислений.
Гипотеза Коллатца: возьмем любое натуральное число x. Если число чётное – делим его на два (х/2), если нечётное – умножаем на 3 и прибавляем 1 (3х+1). Повторяем все эти операции, пока число не станет равным единице. Любое натуральное число в итоге приходит в единицу.
Оно нечетное, поэтому произведем над ним это действие: 3n + 1
3*(x*2*2 n
+ (2 н
– 1)) + 1 =
3*х*2*2 н
+ 3*(2 n
– 1) + 1 =
3*х*2*2 н
+ 2 n+1
+ 2 н
– 3 + 1 =
3*х*2*2 н
+ 2 n+1
+ 2 н
– 2.
Нечетное число после 3n + 1 становится четным, и мы его делим на 2:
(3*x*2*2 n
+ 2 n+1
+ 2 n
– 2)/2 =
3*x*2 n
+ 2 n
+ 2 n-1
– 1 =
2 n
*(3*x + 1) + (2 n-1
– 1) =
(3*x + 1) * 2 * 2 n-1
+ (2 n-1
– 1).
Теперь взгляните на изначальное число и число, полученное после двух операций (одна для нечетного и одна для четного числа). Приведенные вычисления позволяют установить зависимость количества шагов от количества единиц на конце изначального числа в двоичной с.с. Не трудно догадаться, что следующее число будет:
(3*(3*x + 1) +1) * 2 * 2 n-2
+ (2 n-2
– 1).
(3*(3*(3*x + 1) +1) +1) * 2 * 2 n-3
+ (2 n-3
– 1).
Давайте обобщим формулу:
Вы можете видеть конечную сумму ряда степеней 3. Всё приводим к виду:
Итого число x*2*2 n
+ (2 n
– 1), где
превращается в
за 2n шагов (n раз для нечетных числе и n раз для четных чисел).
Как вы могли заметить, на конце полученного числа присутствует множитель 2, следовательно число x*2*2 n
+ (2 n
– 1), где
превращается в
за 2n + 1 шагов (n раз для нечетных числе и n + 1 раз для четных чисел).
Пример, для наглядности:

Теперь давайте эту формулу
представим для начального числа y.
Полученное число может быть как четным, так и не четным, то есть оно будет поделено на 2 m
, где
Сразу встаёт вопрос величины m, как определить это число. Опять обратимся к нашей любимой двоичной системе счисления. Если число делится на 2, то в конце у него стоит 0 в двоичной с.с. Если оно делится на 2 m
, то в конце у него стоит m нулей в двоичной с.с.
Как мог заметить внимательный читатель, первую формулу я вывел исходя из длины последовательности единиц на конце числа в двоичной с.с., а теперь вывожу следующую формулу, но уже из длины последовательности нулей на конце числа в двоичной с.с.
Смотря на число 10100000111, человек без труда может определить сколько на конце единиц (в данном случае 3), но нужна строгая функция, определяющая это число. Опишем две функции: функцию нулей –
и функцию единиц –
Первая ставит в соответствие любому целому неотрицательному числу новое целое неотрицательно число, равное количеству 0 на конце данного числа в двоичной с.с., вторая делает все то же самое, но для единиц на конце данного числа. Опишем представление натуральных чисел в двоичной с.с.:

Теперь опишем функцию нулей и функцию единиц:
Интересно то, что обе эти функции, применённые к одному и тому же числу не могут одновременно иметь значение больше 0 или одновременно быть равными 0. Одна из них равна 0, вторая целому числу больше 0. Также стоит обратить внимание на то, что функция нулей от числа 0 равна бесконечности (если использовать бесконечное количество разрядов для представление всех двоичных чисел, фактически это не значащие нули перед самим числом), или равна 1, если мы договариваемся не использовать не значащие нули перед числом.
Основная теорема арифметики утверждает, что каждое натуральное число, большее единицы, представимо в виде произведения простых чисел, причём единственным способом с точностью до порядка следования сомножителей.
Натуральные числа могут повторяться. Например, 12 = 2*2*3. То есть 2 присутствует во второй степени. Учитывая это вернемся к функции нулей, она возвращает степень двойки, которая присутствует в натуральном числе, переданном функции. Если в числе нет двойки в некой степени, функция вернёт ноль (хотя это 2 в 0 степени).
Ниже представлены графики для двух функций. Синий – функция единиц. Оранжевый – функция нулей. Первый график для промежутка от 1 до 15. Второй для промежутка от 501 до 515.


Как мы видим,
сдвинута относительно
на единицу:
Рассмотрим элементарные математические операции с этими функциями:
Т. к. функция нулей возвращает степень двойки в числе, то умножение чисел сложит показатель степеней двоек в каждом из них.
<img source="f^0 (a)+1=f^0 (a)+f^0
Теперь для функции единиц. Но отталкиваться будет от функции нулей.
Я рассмотрел лишь ограниченное число мат. операций, т.к. не хочу уходить в дебри определения всех возможностей этих функций, в частности умножение функции нулей от числа a на число b – это возведение в степень
Но самые важные вопросы по этим функциям в делении и вычитании. Там уже начинаются игры разума и много вопросов, т.к. появляются дробные числа, и отрицательные числа.
Вернемся к гипотезе Коллатца. Итак
первое число –
<img source="
y_0, ” alt=”
y_0, ” src=”https://habrastorage.org/getpro/habr/upload_files/34a/e94/a36/34ae94a36130483500627099719c17b3.svg”>
второе число –

третье число –

Или мы можем совместить y 1
и y 2
(т.к. y 1
может быть как четным, так и нечетным) –

Итого, получен ряд нечетных чисел, где первое нечетное число –
, а второе –
. Используя формулу
, можно перефразировать гипотезу Коллатца и натуральным числом y 0
– В любой рекуррентной последовательности, заданной рекуррентным соотношением
(без учета нуля) есть член – 1.
Я пробовал найти формулу общего члена последовательности, но тщетно. Может какой-нибудь математик это сделает. Т. к., мне кажется, что доказательство этой гипотезы через формулу общего члена последовательности элементарное, но нахождение этой формулы проблема (по крайней мере для меня).
Кстати, если в эту функцию
сразу подставить 1, то следующий член последовательности тоже будет 1. То есть эта функция (если гипотеза верна) в какой-то момент сходится к 1 и дальше каждый член равняется 1. Перефразирую, если бы была формула общего члена последовательности, то бесконечный член её последовательности был бы равен 1 (если гипотеза верна). Если гипотеза не верна, то бесконечный член был бы равен некому числу отличному от 1.
Так же в функцию
Я написал код программы на Python используя выведенные выше формулы:
def zeroFunc(inpDegree): temp = bin(inpDegree) #функция возвращает двоичный код числа # но вначале он пишет 0b, пример: binЭта программа позволяет подсчитать общее количество шагов до достижения единицы, и количество шагов при использовании моей формулы. Ниже привожу таблицу с числами с самым длинным путем до достижения единицы.
Как вы можете видеть, уменьшение количества шагов в 5 – 6 раз (для достижения единицы).
Все любят приводить в пример число 27. Поэтому не будем отходить от традиций. Ниже представлены числа и количество шагов, рассчитанные по формуле
.
Далее представлены графики:
” title=”График для шагов по формуле
“>

Обязательно ли деление на 2? Если мы смотрим на задачу со стороны
двоичной с.с., то при делении на 2 мы просто отбрасываем 0 в конце. А если
прибавлять 1 не в последний разряд числа в двоичной с.с., а в первый не нулевой
с конца? То это уже не единица, а 2 m
, то последовательность
действий можно изменить с 3n + 1, n/2 на

, и конечной точкой этих действий будет 2 k
.
Пример, для наглядности:

Гипотезу Коллатца можно переформулировать так: любое целое число n, больше 0 при рекрусивном применении к нему формулы
рано или поздно должно прийти к числу 2 k
, где k – целое, не отрицательное число.
Это будет выглядеть так:


Теперь выразим отсюда число x, от которого мы и начали наши операции:

Сократим эту многоэтажную дробь до нормального вида:

Рассматривая эту гипотезу, ученые проверяют наличие циклов. Что такое цикл в данном случае? Это последовательность чередующихся четных и нечетных чисел. Четных – может быть сколько угодно (подряд стоящих), а нечетных – только одно число (подряд стоящее). Существуют ли числа, через которые априори не может проходить цикл?
Давайте попробуем описать все целые неотрицательные числа:
3n + 1
3n + 2
– этих трёх подмножеств достаточно, чтобы описать все числа.
Каждая формула описывает 1/3 всех целых неотрицательных чисел. На каждую их них приходится равное количество четных и нечетных чисел.
Используя операции, описанные в гипотезе (3n + 1, n/2), проверим эти три описанных подмножества на возможность к ним прийти.
1) 3x*2 m
= 3y + 1
2) (3x + 1)*2 m
= 3y + 1
3) (3x + 2)*2 m
= 3y + 1
y – нечетное число, которое мы проверяем на соответствие гипотезе, x – следующее нечетное число, полученное из y.
Рассмотрим подмножество 2:
Первую дробь при любых целых x можно поделить на 3 так, чтоб полученное число было целым.
Для рассмотрения второй дроби обратимся к нашей любимой двоичной с.с.
Условие делимости на 3 в двоичной с.с. – Число делится на 3 тогда и только тогда, когда сумма его цифр стоящих на четных местах отличается от суммы цифр, стоящих на нечетных местах, на число, делящееся на 3.
В 2 m
– 1 при всех четных mбудет равное количество единиц, стоящих на четных местах и единиц стоящих на нечетных местах, следовательно разница между ними равно 0, следовательно число делимо на 3.
В 2 m
– 1 при всех нечетных mразница между количеством чисел на четных не четных позициях будет всегда равна 1, следовательно число никогда не делимо на 3.
Рассмотрим подмножество 3:
Как вы можете видеть, ситуация аналогична подмножеству 2, следовательно рассуждения аналогичны, НО теперь при всех нечетных m мы получим целое число, а при всех четных нет.
Теперь рассмотрим подмножество 1:
Как мы видим, при любых целых x, y всегда будет дробным, следовательно ни при каких условиях нельзя прийти в нечетное число из подмножества 3n, из другого нечетного числа. Это означает, что 1/3 всех целых положительных чисел априори на может попасть в цикл по гипотезе Коллатца.
Моя личная гипотеза: если гипотеза Коллатца верна, то нужно рассматривать только нечетные числа из подмножества 3n, т.к. к двум остальным подмножествам мы придём из этого. Это подмножество можно описать формулой 3 + 6*n.
P. S. Надеюсь мои рассуждения кому-то помогут