надо же озвучить, в чём заключается задача! а то на первый взгляд кажется, что задача - найти значение выражения. А в итоге оказывается, что надо упростить выражение, а не посчитать...
Если только слегка разная скорость. Комп по алгоритму будет вычислять каждый факториал и откладывать в память значение предыдущего. Так что разница между началом и концом ничтожна.
По поводу затратности на компе не согласен, очевидно, факториал бы был посчитан один раз. Суммировать же будем в цикле i от 2 до 499, ну и само-собой напрашивается хранение значений умножения i.
Ты не учитываешь ограничения типа данных. Ты не сможешь обычными математическими операциями в принципе вычислить этот пример с достаточной точностью. Произведение и сумму придётся делать побитово, храня в массиве разряды, потому правая часть быстрее и точнее.
@@ЧенЧен-ц1ь неэффективно - больше памяти жрёт, больше операций, постоянные переходы между типами данных. Не изобретайте велосипед - я вам привёл единственно правильное и применяемое на практике решение данной задачи. Эффективней нет.
@@alexey_latyshev да ладно, современный CPU это всё сожрёт мгновенно. Сейчас проблема не в производительности CPU. И да, есть методы быстрее, без массивов и пр. хрени.
@@ЧенЧен-ц1ь да не сожрёт - проблема в типах данных. Вы иначе без погрешности не решите эту задачу. Ну вбейте в лоб и мной приведённым методом и почувствуйте разницу, насколько менее точен будет ответ, если вообще решите. Вы вообще представляете себе 50! или нет? Мало того, для программ, рассчитанных для работы с такими числами этот метод и применяется. Операционные системы используют данный метод арифметики, а тут некто в инете говорит, что это всё шляпа и предлагает мало того, что решать рекурсию, засрав память мусором, ибо деструктор внятно применить не сможет, так ещё тратить ещё больше памяти и времени на перевод в строковый тип данных и обратно каждый раз. Не изобретайте велосипед - АЛУ и вообще принцип работы арифметики в компьютере уже лет 80 как за нас придумали умные дяди. Ну и в довесок. Да даже 5+5 вы думаете компьютер иначе считает? Точно так же, просто это уже всё вшито и добрый компилятор всё за нас делает, поскольку оба числа, как и сумма вписываются в заданный целочисленный тип данных.
При сложении хотя бы первых трех слагаемых видно, что сумма стремится к единице, а значит сумма всех слагаемых еще больше будет стремится к единице, то есть "один минус бесконечно малая", или ≈1
То, что сумма ряда-продолжения стремится к единице можно, например, сразу увидеть, исходя из того, что это коэффициенты степенного ряда для производной от функции (exp(x)-1)/x
@@andreydorokhov6084Тут можно воспользоваться таким свойством bn > an(исходный) и bn - сходится, то an сходится. n! > n^3 при n -> inf получаем 1/n^2 > an, 1/n^2 - гармонический сходящийся ряд
Я сначала тупо в лоб начал решать и заметил, что если их суммировать по очереди, то знаменатель будет на 1 больше числителя. Можете проверить. И я получил ответ (50!-1)/50!, что равно 1-1/50!.
Сейчас загнал в нормальный калькулятор ответ: 1-(1/50!). И получил 1. Начал уменьшать знаменатель до числа который калькулятор сможет показать. Получилось 1-(1/37!) = 0,(43 штуки 9) и потом другие цифры.
И это всё ошибка: калькулятор даже в компе не умеет сам по себе решать такие задачи - высокая погрешность вычисления из-за ограничений типа данных. Данные задачи решаются побитовой арифметикой, которую надо прописывать вручную, поскольку она используется только системой, а в интерфейсе она не предусмотрена. Ручками пишем код, выделяем память под массив, который будет хранить разряды и поразрядно проводить арифметику. И лучше использовать аналитическое задание, в не рекуррентное, то есть 1-1/50!, иначе засрёте память и/или намучаетесь с деструкторами.
Ну прям современному компу проблема посчитать 500 операций умножения? Если программист баран и каждый раз считает факториал по новой, а не запоминает предыдущий что бы посчитать следующий то возможно займет несколько миллисекунд, а если программист в курсе что такой оптимизация, то это даже не смешно. И самое интересное что с точки зрения количества операций, посчитать 50! займет столько же операций что и все факториалы от 1 до 50.
Очевидно вы не программист. Операция деления занимает в несколько раз больше времени процессора, чем умножение. И вы не сможете ее оптимизировать, ведь делитель каждый раз новый. Если в формуле миллион членов, а нужно в реальном времени постоянно вычислять такую формулу, то вы получите нерешаемую задачу. ЗЫ. Операция деления больших чисел для компьютера убийственна. Придумайте четное число из 100 знаков и поделите его на 2. Чтобы решить такую задачу на компьютере, придется писать специальную программу.
@@_Spellmaniac_ Тут скорее вопрос в том, что пока ты будешь это все вводить на компьютере, можно будет упростить и в той же программе (если надо сосчитать) забить упрощение и все. Намного короче и быстрее получится, ну...если с математикой дружишь.
1. "Современный комп", конечно, может сосчитать большие факториалы. Пакет Mathematica умеет считать АБСОЛЮТНО точно, например 1000! Т.е. результат выводится в виде целого числа, думает долго. 2. Для работы с такими числами встроенная компьютерная арифметика непригодна. Максимум, что можно записать в беззнаковое 4-ех байтное целое -- примерно 4 млрд. 300 млн. Этот предел превышается уже для 13! 3. Это значит, что надо использовать нестандартную арифметику -- специально написанные функции, которые работают гораздо медленнее. Если же оценивать факториалы приблизительно, в виде действительных чисел, то при такой цепочке вычислений накопится большая ошибка. 4. Проведенное в ролике рассмотрение весьма разумно и эффективно с вычислительной точки зрения. В том числе ещё и потому, что можно легко масштабировать задачу. Действовать "пыром", в расчете на мощь компьютеров -- моветон 😁
Правильно нобелевскую премию не дают за математику...придумали хрень и сами не знают зачем...факториалы эти...кому вообще это надо? хоть одну практическую задачу это решает ?!
На жизненной или бытовой практике польза математики кончается уже на иррациональных числах. Если конечно они не приводят к ответу из рационального числа. Но, скажем, та же геометрия должна опираться на простые целые числа, чтобы можно было что то постоить без лишних проблем и временных затрат
Умилило, что автор столь забавно отзывается о компьютере: и ресурсов потребуется уйма, и считать долго будет. Даже интересно стало. Потратил пару минут, набросал программку на языке PascalАВС.NЕТ. Для тех самых "жутких" 499. Получил в ответе единицу. А время вычисления составило... внимание! ... 4.6 миллисекунды! Неописуемо много, конечно ))). Код для желающих повторить: ## [Cache] function f(n:integer): BigInteger := if n n / f(n + 1)).Sum; sw.Stop; Println(sw.Elapsed); // время выполнения 00:00:00.0046259 - это 4.6 мс r.Print Но это, конечно же, не означает, что любые задачи нужно кидаться решать "в лоб". Поэтому, если человек не в ладах с математикой, хорошего программиста из него не получится никогда.
Вообще-то не простая задача. Я честно говоря задымился.
Передрочил?
надо же озвучить, в чём заключается задача! а то на первый взгляд кажется, что задача - найти значение выражения. А в итоге оказывается, что надо упростить выражение, а не посчитать...
Я надеюсь, это рофл
Если только слегка разная скорость. Комп по алгоритму будет вычислять каждый факториал и откладывать в память значение предыдущего. Так что разница между началом и концом ничтожна.
1/50! Стремится к нулю, тогда и ответ соответственно стремится к 1
"С языка сняли"
Спасибо. Всегда полезно потренировать мозг... и вспомнить детство золотое
Учебник Сканави, 4-й уровень сложности..Помню этот пример, решить не смог.
По поводу затратности на компе не согласен, очевидно, факториал бы был посчитан один раз. Суммировать же будем в цикле i от 2 до 499, ну и само-собой напрашивается хранение значений умножения i.
Ты не учитываешь ограничения типа данных. Ты не сможешь обычными математическими операциями в принципе вычислить этот пример с достаточной точностью.
Произведение и сумму придётся делать побитово, храня в массиве разряды, потому правая часть быстрее и точнее.
@@alexey_latyshev да легко смогу, буду хранить результат в string (varchar), да придётся написать отдельную функцию в несколько строк.
@@ЧенЧен-ц1ь неэффективно - больше памяти жрёт, больше операций, постоянные переходы между типами данных. Не изобретайте велосипед - я вам привёл единственно правильное и применяемое на практике решение данной задачи. Эффективней нет.
@@alexey_latyshev да ладно, современный CPU это всё сожрёт мгновенно. Сейчас проблема не в производительности CPU. И да, есть методы быстрее, без массивов и пр. хрени.
@@ЧенЧен-ц1ь да не сожрёт - проблема в типах данных. Вы иначе без погрешности не решите эту задачу. Ну вбейте в лоб и мной приведённым методом и почувствуйте разницу, насколько менее точен будет ответ, если вообще решите.
Вы вообще представляете себе 50! или нет? Мало того, для программ, рассчитанных для работы с такими числами этот метод и применяется. Операционные системы используют данный метод арифметики, а тут некто в инете говорит, что это всё шляпа и предлагает мало того, что решать рекурсию, засрав память мусором, ибо деструктор внятно применить не сможет, так ещё тратить ещё больше памяти и времени на перевод в строковый тип данных и обратно каждый раз.
Не изобретайте велосипед - АЛУ и вообще принцип работы арифметики в компьютере уже лет 80 как за нас придумали умные дяди.
Ну и в довесок. Да даже 5+5 вы думаете компьютер иначе считает? Точно так же, просто это уже всё вшито и добрый компилятор всё за нас делает, поскольку оба числа, как и сумма вписываются в заданный целочисленный тип данных.
Великолепно. Понягога простите неща изглеждат много сложни.
При сложении хотя бы первых трех слагаемых видно, что сумма стремится к единице, а значит сумма всех слагаемых еще больше будет стремится к единице, то есть "один минус бесконечно малая", или ≈1
То, что сумма ряда-продолжения стремится к единице можно, например, сразу увидеть, исходя из того, что это коэффициенты степенного ряда для производной от функции (exp(x)-1)/x
Это при n стремящемся к бесконечности ряд стремится к 1.
Спасибо.
Хороший ход в числителе 👍 если сразу его сократить можно приехать в стену.
Классно, спасибо!
Круто! Сходящийся ряд. Правда не помню как доказать сходимость такого ряда
Элементарно. Надо сказать волшебную фразу: Очевидно, что ряд сходится🤣
Тут тупо считается предел.
@@juliusmironoff9133в смысле? Поясните
@@juliusmironoff9133ну предел это необходимое условие, а не достаточное.
@@andreydorokhov6084Тут можно воспользоваться таким свойством bn > an(исходный) и bn - сходится, то an сходится. n! > n^3 при n -> inf получаем 1/n^2 > an, 1/n^2 - гармонический сходящийся ряд
Красота
Волков решал эту задачу проще и быстрее.
Да. Ресурсов на много меньше.
Простая задача. Думаю,что даже автор ролика сам её решил.
Я сначала тупо в лоб начал решать и заметил, что если их суммировать по очереди, то знаменатель будет на 1 больше числителя. Можете проверить. И я получил ответ (50!-1)/50!, что равно 1-1/50!.
Знаете если первые несколько раз это случилось, то это случайность, последующие несколько - это потянет на теорию, остальное - закономерность.
@@hefneryung2783 ну по индукции можно было доказать это. так что тоже рабочее решение
Спасибо, все интересно и познавательно, но... многие, конечно со мной не соглашаться и все таки ... Можно рассказывать без причмокивания.
Я бы, честно, помедитировал над разностью и, скорее всего, не смог бы это решить
Сейчас загнал в нормальный калькулятор ответ: 1-(1/50!). И получил 1.
Начал уменьшать знаменатель до числа который калькулятор сможет показать.
Получилось 1-(1/37!) = 0,(43 штуки 9) и потом другие цифры.
И это всё ошибка: калькулятор даже в компе не умеет сам по себе решать такие задачи - высокая погрешность вычисления из-за ограничений типа данных.
Данные задачи решаются побитовой арифметикой, которую надо прописывать вручную, поскольку она используется только системой, а в интерфейсе она не предусмотрена.
Ручками пишем код, выделяем память под массив, который будет хранить разряды и поразрядно проводить арифметику.
И лучше использовать аналитическое задание, в не рекуррентное, то есть 1-1/50!, иначе засрёте память и/или намучаетесь с деструкторами.
Ну прям современному компу проблема посчитать 500 операций умножения? Если программист баран и каждый раз считает факториал по новой, а не запоминает предыдущий что бы посчитать следующий то возможно займет несколько миллисекунд, а если программист в курсе что такой оптимизация, то это даже не смешно. И самое интересное что с точки зрения количества операций, посчитать 50! займет столько же операций что и все факториалы от 1 до 50.
Очевидно вы не программист. Операция деления занимает в несколько раз больше времени процессора, чем умножение. И вы не сможете ее оптимизировать, ведь делитель каждый раз новый. Если в формуле миллион членов, а нужно в реальном времени постоянно вычислять такую формулу, то вы получите нерешаемую задачу.
ЗЫ. Операция деления больших чисел для компьютера убийственна. Придумайте четное число из 100 знаков и поделите его на 2. Чтобы решить такую задачу на компьютере, придется писать специальную программу.
@@_Spellmaniac_ Тут скорее вопрос в том, что пока ты будешь это все вводить на компьютере, можно будет упростить и в той же программе (если надо сосчитать) забить упрощение и все. Намного короче и быстрее получится, ну...если с математикой дружишь.
1. "Современный комп", конечно, может сосчитать большие факториалы. Пакет Mathematica умеет считать АБСОЛЮТНО точно, например 1000! Т.е. результат выводится в виде целого числа, думает долго.
2. Для работы с такими числами встроенная компьютерная арифметика непригодна. Максимум, что можно записать в беззнаковое 4-ех байтное целое -- примерно 4 млрд. 300 млн. Этот предел превышается уже для 13!
3. Это значит, что надо использовать нестандартную арифметику -- специально написанные функции, которые работают гораздо медленнее. Если же оценивать факториалы приблизительно, в виде действительных чисел, то при такой цепочке вычислений накопится большая ошибка.
4. Проведенное в ролике рассмотрение весьма разумно и эффективно с вычислительной точки зрения. В том числе ещё и потому, что можно легко масштабировать задачу.
Действовать "пыром", в расчете на мощь компьютеров -- моветон 😁
@@_Spellmaniac_ , уже давно не нужно. Реализована целочисленная арифметика с произвольной разрядностью.
Почитала комментарии, поняла, что я, наверное, плохо в школе училась. Или это не из школьной программы?
Это реально решить школьнику, т.к все факты и действия в рамках школьной программы
Когда уже эти незадачливые «математики» научатся различать понятия «сокращается» и «взаимно уничтожается»? ПОЗОРИЩЕ!
Как это вбить в компьютер?😳
Капец, до чего техника дошла!
Я не знаю как это в компьютер вбить, а он уже умеет это решать!😃👍
Рефакторинг, так сказать!
2! ха-ха ) Я понимаю, что написано для наглядности сходимости рядов, но 2! это смешно )
Красиво
Согласна 😊
💣🧠👍
очень коварно.
Правильно нобелевскую премию не дают за математику...придумали хрень и сами не знают зачем...факториалы эти...кому вообще это надо? хоть одну практическую задачу это решает ?!
На жизненной или бытовой практике польза математики кончается уже на иррациональных числах. Если конечно они не приводят к ответу из рационального числа. Но, скажем, та же геометрия должна опираться на простые целые числа, чтобы можно было что то постоить без лишних проблем и временных затрат
Практические задачи - перестановки, размещения и сочетания, здесь без факториала никак.
@@aleksgavr6191 перестановки в квартире? Не понял о чем речь...
@@lemagnifique2360 да хотя бы перестановки колес на авто, сколько всего существует вариантов?
@@aleksgavr6191 не видел чтобы в шиномонтаже кто-то скрипел карандашом вычисляя факториалы при перестановке колёс
Что-то я не помню в советских задачах даже слова факториал, не то, чтобы решать это.
На надо врать
Ну это вы плохо учились. Факториалы изучали, но большого внимания на них не уделялось.
Зачем оптимизировать, если можно взять компьютер помощнее.
Умилило, что автор столь забавно отзывается о компьютере: и ресурсов потребуется уйма, и считать долго будет. Даже интересно стало. Потратил пару минут, набросал программку на языке PascalАВС.NЕТ. Для тех самых "жутких" 499. Получил в ответе единицу. А время вычисления составило... внимание! ... 4.6 миллисекунды! Неописуемо много, конечно ))).
Код для желающих повторить:
##
[Cache]
function f(n:integer): BigInteger := if n n / f(n + 1)).Sum;
sw.Stop;
Println(sw.Elapsed); // время выполнения 00:00:00.0046259 - это 4.6 мс
r.Print
Но это, конечно же, не означает, что любые задачи нужно кидаться решать "в лоб". Поэтому, если человек не в ладах с математикой, хорошего программиста из него не получится никогда.