Гамма-функция и факториал: вычислительные вопросы

Discussion in 'Кухня' started by Pia, 19 Oct 2008.

  1. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Вот пример, как не надо программировать. Чем больше n, тем меньше факториал!? Где ошибка?
    Не понимаю я эти формулы... :/

    {$N+}

    var
    n:extended;

    procedure bug;
    var
    r1,r2,r3,f:extended;
    k:longint;
    begin
    r1:=2/(n+1);
    f:=1;
    for k:=2 to 1700 do
    begin
    f:=f*k;
    r2:=f*(k+1);
    r3:=f*(n+k);
    r1:=r1*(r2/r3);
    end;
    writeln(n,'! <> ',r1);
    end;

    begin
    repeat
    readln(n);
    bug;
    until false;
    end.
  2. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    совершенно неубедительная формула. во-первых, бесконечное число множителей - уже круто. правда, подразумевается, что и сокращаться будет столько же раз. во-вторых, захочу посчитать 3! - для этого придется считать и 100!... бессмысленно. проще посокращать и получить k/(n+k)
  3. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    1) Почему эта "специализированная оттестированная библиотека" даёт только 6 знаков мантиссы для 100!, а "придуманный свой метод" до 18 знаков?
    2) Как программа работает, где исходники?
    Да, я так игрался лет 10 назад. Вычислил 32000+ знаков числа e.
    Вот когда программа факториалов будет показывать 18 знаков (предел для паскаля) во всех диапазонах, то пора переходить на более точное исчисление.
  4. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Я надеялся, что с её помощью смогу находить факториалы для небольших нецелых точнее, чем сейчас.
  5. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    а вот здесь на библиотеку катить бочку не надо. Библиотека даёт 6 знаков мантиссы потому как double такую точность даёт. Однако функция factorial является шаблонной, потому можно получить любую точность, в зависимости от типа. есть в этой библиотеке тип double_t - можно его использовать для повышения точности.
    вот те пару строк и есть исходники. плюс boost - библиотека.
    а причем тут е? или бесконечный ряд складывали?
  6. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    кстати, прошу не говорить "факториал нецелого числа" - слух режет. тем более что это невозможно, как уже выяснили.
  7. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Ну так что Вы советовали? Советовали не использовать эти ряды? Да? Я их использовал ещё в первой программе в первом посте. И даже использовал 10 лет назад. Что мне использовать, если не их?
  8. Vladimirovich Консультант

    • Ветеран
    • Заблокирован
    • Старожил
    Member Since:
    27.09.2006
    Message Count:
    6.007
    Likes Received:
    810
    Репутация:
    31
    Нарушения:
    31
    Location:
    https://quantoforum.ru/
    Оффлайн
    Я не советовал в
    http://kasparovchess.crestbook.com/viewtopic.php?pid=205062#p205062
    использовать формулы, задействованные Вами чуть выше в
    http://kasparovchess.crestbook.com/viewtopic.php?pid=204949#p204949
    В первой программе из первого поста используется другой ряд, как я понимаю.

    P.S Вы чем-то раздражены, Pia? Будьте спокойнее и внимательнее к чужим постам.
    Я нигде Вас не обманывал :)
  9. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    А я всё-таки использовал одну из этих формул в основной программе. Правда, только для n < 3. Так точнее. Не говоря уж об отрицательных величинах. Но возможно, когда найду больше "коэфициентов" для формулы Стирлинга-Лапласа и реализую вашу Г(z)=pi/blabla*Г(1-z), то она устареет.
  10. WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.491
    Likes Received:
    3.118
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Ай-ай-ай! Ну, хорошо хоть, что только 32000... Потому что Е, как и Пи, число очень опасное :)

    WARNING: Do NOT calculate Pi in binary. It is conjectured that this number is normal, meaning that it contains ALL finite bit strings.
    If you compute it, you will be guilty of:


    1. Copyright infringement (of all books, all short stories, all newspapers, all magazines, all web sites, all music, all movies, and all software, including the complete Windows source code)
    2. Trademark infringement
    3. Possession of child pornography
    4. Espionage (unauthorized possession of top secret information)
    5. Possession of DVD-cracking software
    6. Possession of threats to the President
    7. Possession of everyone's SSN, everyone's credit card numbers, everyone's PIN numbers, everyone's unlisted phone numbers, and everyone's passwords
    8. Defaming Islam. Not technically illegal, but you'll have to go into hiding along with Salman Rushdie.
    9. Defaming Scientology. Which IS illegal — just ask Keith Henson.


    http://www.everything2.net/index.pl?node_id=1302963
  11. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Даже Vladimirovich говорит вот что:
  12. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    однако он не говорит, что можно вычислить факториал дроби. вообще-то я заканчивал униварситет по специальности "Математика", и знаю что таке гамма-функция. тем более что специализировался на кафедре математического анализа. так что в данном случае я сам себе авторитет :cool: :lol:
  13. Vladimirovich Консультант

    • Ветеран
    • Заблокирован
    • Старожил
    Member Since:
    27.09.2006
    Message Count:
    6.007
    Likes Received:
    810
    Репутация:
    31
    Нарушения:
    31
    Location:
    https://quantoforum.ru/
    Оффлайн
    Pia, Вы напрасно ссылаетесь на меня.
    Я говорил, что Гамма-функция есть обобщение для вещественных и комплексных чисел.

    Я также писал
    И если Вас не затруднит, приведите определение ( именно определение, а не приближенный ряд) факториала для нецелых чисел, отличное от Гамма-функции.
  14. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Странно. У паскаля "double" - 14 знаков мантиссы. Вот "single" - да, 6.
    Но ни как не 3, как у "boost::math::tgamma(16.5)"
    Я на C++ не пишу. К сожалению. Пусть кто-нибудь скомпилирует эту программу с библиотекой.
    Я хочу узнать, какая у неё точность при следующих величинах...
    Моя программа в настоящий момент:
    Code:
    Г(-19.8)=-20.8!=4.01551e-18
    Г(1.2)=0.2!=0.9181687
    Г(19.1)=18.1!=8 573 943 458 925 284.3
    (1.7e+308)! = 10^(5.23253462547107538e+310)
    Я не так понял. Что касается, например, 1/3*1/7=0.0(476190), то просто нужны операции с дробями. =1/21. Потом программа просто находит повторения в числе. Восемнадцати знаков может не хватить, как например для 63/68 - и нужны более точные исчисления в обход стандартных функций математического процессора. "захочу посчитать 3! - для этого придется считать и 100!... бессмысленно. проще посокращать" Так же и тут - зачем находить последовательность чисел если есть простая дробь? Но зачем вычислять дроби? Калькулятор Windows это делает. Он хранит 1/3 вместо 0.33333... На бухгалтерских калькуляторах 1/3*3=0.999999... Но у меня есть Scietific Calclator Citzen при простом делении 1/3 хоть он и не работает с дробями в этом режиме, но при 1/3*3 показывает =1. Как? Просто он хранит дополнительные знаки и просто округляет. Так при четырёх дополнительных знаках можно спокойно делать до 9999 операций.
  15. PP Заблокирован

    • Заблокирован
    Member Since:
    21.02.2006
    Message Count:
    1.023
    Likes Received:
    148
    Репутация:
    5
    Нарушения:
    31
    Оффлайн
    На C++ не пишете, свойства синуса не знаете, вычислить коэффициенты по формуле не можете...
    Попробуйте научиться пользоваться гуглом
    http://www.boost.org/doc/libs/1_35_...tml/math_toolkit/special/sf_gamma/tgamma.html
  16. drowsy Учаcтник

    • Участник
    Member Since:
    08.09.2006
    Message Count:
    1.282
    Likes Received:
    1
    Репутация:
    0
    Location:
    Toronto, Canada
    Оффлайн
  17. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Что бы вы там все не говорили, оказываясь от своих слов, и не понимая что означает их смысл,
    То есть, когда нужно вычислить факториал любого числа, кроме негативных целых, мы пользуемся Гамма-функцией. Это значит, что факториалы дробных чисел вычисляются и существуют. Отрицать это - просто ханжество.

    Если Вас не затруднит, приведите определение ( именно определение, а не интеграл или бесконечный ряд ) Гамма-функции, отличное от ! и !!
  18. EgisLT Учаcтник

    • Участник
    Member Since:
    14.12.2007
    Message Count:
    431
    Likes Received:
    12
    Репутация:
    0
    Оффлайн
    Это всего-то значение Гамма функции, а не факториал любого числа.
    G(z) <> z! for all z (R & C)
  19. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Я туда раньше заходил, но хочется увидеть практические результаты.
    На паскале я пишу лучше, чем krey на C++ со специализированными библиотеками. Надо же додуматься - дать всего 3 знака, если можно больше! И вообще, какой смысл такой функции, если по убеждению krey она даёт результаты только для целых, когда Musitiz дал программу которая целые считает без погрешности?
    А Вы знаете, чем отличается Truncate от Trunc?
    Всё я могу, просто времени нет на программу пока спорю с вами. И вообще, я на сегодня устал чтобы заниматься программой.
  20. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Г(z+1) = z! for all z (R & C)
    (z-1)! = Г(z) for all z (R & C)
  21. drowsy Учаcтник

    • Участник
    Member Since:
    08.09.2006
    Message Count:
    1.282
    Likes Received:
    1
    Репутация:
    0
    Location:
    Toronto, Canada
    Оффлайн
    Кстати, как вы доказываете, что все ваши знаки верные?
  22. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Проверяю калькулятором Windows. Программа погрешность не учитывает - формула ещё в стадии разработки.
  23. Vladimirovich Консультант

    • Ветеран
    • Заблокирован
    • Старожил
    Member Since:
    27.09.2006
    Message Count:
    6.007
    Likes Received:
    810
    Репутация:
    31
    Нарушения:
    31
    Location:
    https://quantoforum.ru/
    Оффлайн
    Pia, Определение через интеграл при условии его абсолютной сходимости - это абсолютно нормальный способ определения функции.
    Есть много спец.функций, которые иначе и выражены-то быть не могут.
    Также возможен вариант определения через функциональное или дифференциальное уравнение.

    А вот определение через приближенный ряд нормальным определением не является.
    Понятие факториала связано с произведением последовательных натуральных чисел
    Попробуйте дать определение факториала нецелого числа, хоть сколько нибудь похожее и обобщающее.
    Если не сможете, то это будет другое понятие.
    От того что вы назовете портвейн коньяком вкус его не изменится :)

    Иначе говоря - логика примерно такая
    —— То есть, когда нужно увидеть зеленую зверюшку, мы идем в лес, находим зверюшку и пользуемся зеленой краской . Это значит, что зеленые зверюшки существуют. ——

    Блестяще :)
  24. drowsy Учаcтник

    • Участник
    Member Since:
    08.09.2006
    Message Count:
    1.282
    Likes Received:
    1
    Репутация:
    0
    Location:
    Toronto, Canada
    Оффлайн
    Всё с вами ясно. Дохлый номер.
  25. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    я немного ошибся, особенность выдачи результата - проблема работы потоков вывода. я изменил немного код:
    Code:
    #include "boost/math/special_functions/factorials.hpp"
    #include <stdio.h>
    
    int main()
    {
        long double result = boost::math::factorial<long double>(100);
        printf("factorial(100) = %lf\n", result);
        result = boost::math::double_factorial<long double>(100);
        printf("double_factorial(100) = %lf\n", result);
        result = boost::math::tgamma<long double>(16.5);
        printf("tgamma(16.5) = %lf\n", result);
        return 0;
    }
    Результат не замедлил сказаться:
  26. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    кстати,
    Code:
    tgamma(19.1) = 8573943458925320.000000
    так говорят я и библиотека boost, а мы программировать не очень умеем.:(
    дело в том, что в состав boost входит библиотека blas (и не только она), используемая математиками для организации вычислений. как в нашем университете, так и в европейских (по крайней мере в Германии). почему математики используют такие неточные методы вычислений?! :rolleyes:
  27. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    krey, моя программа всё-таки на 1-2 знака лучше:
    P.S. а в последнем результате моя программа выдала тоже самое для Г(19.1)=18.1!
  28. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    tgamma(e) = 1.567468
  29. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    думаю, не всё так просто. количество разрядов не совпадает. и я склонен верить библиотеке boost
  30. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    забыл указать особенность моей программы: ответ получаю мгновенно :D
  31. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Нет логика такая, что когда мы хотим увидеть перевёрнутое изобращение, мы переворачиваем зеркало и думаем, что оно уже не будет зеркалом, но ошибаемся.

    Что Вы там выше написали - просто... как это помягче... не буду.
    Где определение Гамма-функции? Почему Вы считаете формулу Стирлинга-Лапласа приближённой? Попробуйте решить свой интеглал без такого же ряда.

    [​IMG]
    В формуле выше замените n на z.
    [​IMG]
    [​IMG]
    [​IMG]
  32. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Как это не совпадает? Везде по 15+1 (мантисса). То есть, 16 знаков целого числа.
  33. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    У моей программы тоже есть такая "особенность", но для больших чисел (больше 3). И этот диапазон будет расширен до абсолюта.
  34. Vladimirovich Консультант

    • Ветеран
    • Заблокирован
    • Старожил
    Member Since:
    27.09.2006
    Message Count:
    6.007
    Likes Received:
    810
    Репутация:
    31
    Нарушения:
    31
    Location:
    https://quantoforum.ru/
    Оффлайн
    Pia, хотите узнать как оно на самом деле?

    Просвещенный отрок Pia нашел в любимом виндовом калькуляторе кнопку n!
    И решил ввести туда 0.5!
    И получил число и сделал так :rolleyes:
    Что он получил, он понятия не имел, и назвал это факториалом нецелых чисел.

    То что такого термина нет, Pia понятия не имел, и загуглился
    Нашел вот эту бредятину
    http://www.wikiznanie.ru/ru-wz/index.php/Факториал_дробного_числа
    и скопипастил ее здесь на форуме без указания источника
    Объяснить это отрок Pia не смог, что говорит о его выдающемся интеллекте и уникальной интуиции.

    Потом ему объяснили, что на самом деле он вычислил Гамма-функцию.
    Как же так, закричал Pia, вот идиоты, ведь в виндовом калькуляторе написано факториал.
    И бросился он с виндовым калькулятором наперевес опровергать многовековые формулы. И невдомек дурашке было, что виндовым калькулятором надо уметь еще пользоваться.

    ( 2 Pia -
    1. Нажать на калькуляторе виндовом подряд 2+2*2=
    A. В научном режиме
    Б. В обычном режиме
    2. Объяснить полученную разницу )

    Продолжим.

    И теперь упорный отрок Pia приводит нам определения факториала нецелых, не имеющие ничего общего с произведением последовательных натуральных чисел, спертые скопипастенные из статей про Гамма-функцию.
    Да еще и неточные.
    И в которых он и половины не понимает.
    И как считаются коэфициенты ряда Стирлинга Pia не знает. А гугл молчит :) .
    И то что разложения Лапласа и Стирлинга, именами которых отрок бодро оперирует суть просто приближения с похожими в начале коэффициентами
    (потому что e(x) ~= 1+x при малых x)

    Грустно, отрок Pia.

    Слова еще используете
    В Бобруйск детский сад :)
  35. TopicStarter Overlay

    Pia Учаcтник

    • Участник
    Member Since:
    11.06.2007
    Message Count:
    537
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Vladimirovich, тебе действительно осталось делать нефига, как только искать опечатки. Подожди, пока я не напишу программу. Формула настолько простая, что я боюсь, меня кто-нибудь опередит пока буду отдыхать. А коэффиценты спёрты не из Гамма-функции, а Гамма-функция спёрла их у факториала, равно как и формулу Стирлинга.

Share This Page