Как вычислить факториал большого числа?

Тема в разделе "WASM.BEGINNERS", создана пользователем Adrax, 10 мар 2007.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Дамссс, хорошие бегиннеры сейчас пошли!
     
  2. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Помню разок патался влезть в "серьезный" раздел так меня быстро оттуда нагнали вот и не парюсь. :)))
     
  3. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Всем огромное спасибо!

    2 murtix
    Пытаюсь разобраться с гамма-функцией. Спасибо за код.
    2 nitrotoluol
    Спасибо за исходник. Разбираюсь...

    Ну а в целом, господа программисты, есть ли какие-нибудь общепринятые эффективные алгоритмы работы с большими числами (умножение, возведение в степень и т.д.) с реализацией на ассемблере? Возможно, готовые библиотеки (желательно к FASM)?
     
  4. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    В GMP есть сорцы - там оптимизация под кучу различных процессоров (от ARM до Cray).
    Для IA32 там реализация умножения методом Карацубы на асме есть.
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    а еще есть формула Стирлинга:
    n!~= (2*pi*n)^0.5 * (n/e)^n
    здесь ^ обозначает возведение в степень

    формула довольно таки точная, причем ее относительная погрешность убывает с ростом n
    уже для n=5 формула дает 118 вместо 120, то есть расхождение меньше 2%
     
  6. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 ECk
    Скачал GMP, немного растерялся... В каком из многочисленных файлов искать пример умножения больших чисел на ассемблере x86-32?
     
  7. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    в каталоге mpn\ если не путаю - а там, смотря какой процессор тебя интересует (generic - там портабельный, а в других - каталогах заточенные под разные процы файлы)
     
  8. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 ECk
    Большое спасибо!
     
  9. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nouzui
    Есть еще более точные аппроксимирующие приближения (уточняющие формулу Стирлинга).
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    crypto
    все равно с их помощью быстрее не получится, со Стирлингом, по крайней мере, выигрыша точно никакого

    ну хез что там за алгоритм.. я попробовал тупо в лоб, и для факториала 50000 у меня получилось быстрее (калькулятор ~ 20 сек, у меня ~ 8). Вот код:

    Код (Text):
    1. unsigned short array[1000000] = {1};
    2. unsigned int len= 1;
    3.  
    4. #define FACTOR  50000
    5.  
    6. int main()
    7. {
    8.     // TODO: Place code here.
    9.     unsigned int i;
    10.     unsigned long l;
    11.     unsigned long cn;
    12.  
    13.     cn= 0;
    14.     for(l= 1; l<=FACTOR; l++)
    15.     {
    16.         for(i= 0; i<len || cn; i++)
    17.         {
    18.             cn+= array[i]*l;
    19.             array[i]= (unsigned short)(cn%10000);
    20.             cn/= 10000;
    21.         }
    22.         len= i;
    23.     }
    24.  
    25.     printf("%d", array[len-1]);
    26.     for(i= len-1; i--;)
    27.     {
    28.         printf("%04d", array[i]);
    29.     }
    30.  
    31.     printf("\n");
    32.    
    33.     return 0;
    34. }
    ps: может ты просто тестил Debug конфигурацию?
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nouzui
    А ты не пробовал факториал через логарифмы считать?
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    и что потом с этим логарифмом делать? порядок, конечно, быстренько узнаешь, а как в степень возводить?
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nouzui
    Есть же у сопроцессора функция exp(x)
     
  14. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ну есть.. да ну, стоит ли это того?
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nouzui
    Для больших чисел через логарифмы будет быстрее...
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    а сами логарифмы считаются не дольше?
     
  17. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nouzui
    Поставь эксперимент, результатом его должна быть таблица, сопоставляющая результаты расчетов в лоб и с помощью логарифмов
     
  18. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    crypto
    оч надо ))
    это Adrax загоняется, а не я.. гы
     
  19. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nouzui
    Офтоп
    Знаешь, что здесь с ленивыми делают?
    Их помещают в качестве экспонатов в раздел Вирология :)
     
  20. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    гм..
    а по-моему, это кому-то нужна таблица производительности логарифмического метода, и он упорно хочет найти кого-то, кто ее сделает