Tulup.ru - Клуб любителей фигурного катания

Шизофрения

Автор
Сообщение
bregalad
Сообщений: 12610
Москва
01.12.2024, 16:07
Шизофрения
bregalad пишет:
анон-анон пишет:
bregalad пишет:
бывают и интересные задачи. Одну я прочитал в какой-то статье про Андрея Дмитриевича Сахарова. Между стеной и человеком натянута резинка длиной в 1 метр, в ее начале находится жучок. Жучок проползает по резинке 1 см, после чего человек, растягивая резинку, отходит на 1 км. Так повторяется многократно.

итерация описана не полностью, через два шага расстояние будет 1000 км или что?

Длина резинки последовательно меняется: 1 метр, 1км+1м, 2км+1м, 3 км+1м и т.д. Когда резинка растягивается, жучок на ней тоже перемещается. Можно считать долю общей длины резинки, которую жучок преодолел. В первый момент она равна 1cm/1m =0.01, после отхода на километр и проползания жучком 1см она равна 0.01 + 1см/(1км+1м) = 0.01 + 1/(100000+100), после второго этапа 0.01 + 1/(100000+100) + 1/(200000+100), после третьего 0.01 + 1/(100000+100) + 1/(200000+100) + 1/(300000 + 100) и т.д. Очевидно, что ряд расходится (частичная сумма ограничена снизу величиной 1/100000*(1/2+1/3+1/4+1/5+..., а это расходящийся гармонический ряд).

Быстренько написал программу на Питоне, подсчитывающую, через сколько шагов жучок доползет до человека:

distanceFraction = 1/100000
time = 0
while distanceFraction < 1:
    time += 1
    distanceFraction += 1/(time*100000+100)
print("Total time =", time)

Увы, сумма гармонического ряда настолько медленно растет (скорость логарифмическая), что дождаться окончания этой программы невозможно. Ладно, заменим километр на метр (жучок проползает сантиметр, человек отходит на метр):

distanceFraction = 1/100
time = 0
while distanceFraction < 1:
    time += 1
    distanceFraction += 1/(time*100+1)
print("Total time =", time)

Всё равно дождаться окончания невозможно...

Но вообще-то можно вспомнить, что мы учили математику и что частичная сумма гармонического ряда оценивается как натуральный логарифм и примерно равна
    1+1/2+1/3+1/4+1/5+...+1/n ≈ ln(n) + 0.577
Тогда пишем другую программу (для расстояния 1 метр, не километр!), применяя на этот раз математику:

from math import *
# Approximate sum of harmonic series:
# 1+1/2+1/3+1/4+...+1/n == log(n) + 0.577

# Solve the equation:
# 1/100*(1/2+1/3+1/4+1/5+...1/n) = 1
# This is equivalent to:
# 1/100*(harmonicSum(n) - 1) = 1
# harmonicSum(n) = 1 + 100
# log(n) = 1 + 100 - 0.577
# n = exp(1 + 100 - 0.577)

n = exp(1 + 100 - 0.577)
k = int(n)
print("number of steps <=", k)


Запускаем программу с помощью python3 и получаем ответ:

number of steps <= 41035030085576654404824517296440350489968640

Да, жучка придется ждать очень долго (может, я ошибся в выкладках?).
Вход


Имя
Пароль
 
Поиск по сайту
Найти пользователя
Найти

© Tulup 2005–2026
Время подготовки страницы: 0.014 сек.