/*
Copyright (C) 2014 Fredrik Johansson
This file is part of Arb.
Arb is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See .
*/
#include "arb.h"
/* See verify_taylor.py for code to generate tables and
proof of correctness */
#define TMP_ALLOC_LIMBS(size) TMP_ALLOC((size) * sizeof(mp_limb_t))
#define FACTORIAL_TAB_SIZE 288
#if FLINT_BITS == 64
ARB_DLL const mp_limb_t factorial_tab_numer[FACTORIAL_TAB_SIZE] = {
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(1216451004088320000),
UWORD(405483668029440000),
UWORD(101370917007360000),
UWORD(20274183401472000),
UWORD(3379030566912000),
UWORD(482718652416000),
UWORD(60339831552000),
UWORD(6704425728000),
UWORD(670442572800),
UWORD(60949324800),
UWORD(5079110400),
UWORD(390700800),
UWORD(27907200),
UWORD(1860480),
UWORD(116280),
UWORD(6840),
UWORD(380),
UWORD(20),
UWORD(1),
UWORD(169958063987712000),
UWORD(7725366544896000),
UWORD(335885501952000),
UWORD(13995229248000),
UWORD(559809169920),
UWORD(21531121920),
UWORD(797448960),
UWORD(28480320),
UWORD(982080),
UWORD(32736),
UWORD(1056),
UWORD(33),
UWORD(1),
UWORD(405179306820288000),
UWORD(11576551623436800),
UWORD(321570878428800),
UWORD(8691104822400),
UWORD(228713284800),
UWORD(5864443200),
UWORD(146611080),
UWORD(3575880),
UWORD(85140),
UWORD(1980),
UWORD(45),
UWORD(1),
UWORD(129210868410624000),
UWORD(2749167412992000),
UWORD(57274321104000),
UWORD(1168863696000),
UWORD(23377273920),
UWORD(458377920),
UWORD(8814960),
UWORD(166320),
UWORD(3080),
UWORD(56),
UWORD(1),
UWORD(13431688016947200),
UWORD(231580827878400),
UWORD(3925098777600),
UWORD(65418312960),
UWORD(1072431360),
UWORD(17297280),
UWORD(274560),
UWORD(4290),
UWORD(66),
UWORD(1),
UWORD(51698307350592000),
UWORD(760269225744000),
UWORD(11018394576000),
UWORD(157405636800),
UWORD(2216980800),
UWORD(30791400),
UWORD(421800),
UWORD(5700),
UWORD(76),
UWORD(1),
UWORD(166872705665702400),
UWORD(2139393662380800),
UWORD(27080932435200),
UWORD(338511655440),
UWORD(4179156240),
UWORD(50965320),
UWORD(614040),
UWORD(7310),
UWORD(86),
UWORD(1),
UWORD(4900933563926400),
UWORD(55692426862800),
UWORD(625757605200),
UWORD(6952862280),
UWORD(76405080),
UWORD(830490),
UWORD(8930),
UWORD(95),
UWORD(1),
UWORD(10385445095625600),
UWORD(107066444284800),
UWORD(1092514737600),
UWORD(11035502400),
UWORD(110355024),
UWORD(1092624),
UWORD(10712),
UWORD(104),
UWORD(1),
UWORD(20632508204394240),
UWORD(194646303815040),
UWORD(1819124334720),
UWORD(16843743840),
UWORD(154529760),
UWORD(1404816),
UWORD(12656),
UWORD(113),
UWORD(1),
UWORD(38823716505974400),
UWORD(337597534834560),
UWORD(2910323576160),
UWORD(24874560480),
UWORD(210801360),
UWORD(1771440),
UWORD(14762),
UWORD(122),
UWORD(1),
UWORD(69746158460160000),
UWORD(562469019840000),
UWORD(4499752158720),
UWORD(35712318720),
UWORD(281199360),
UWORD(2196870),
UWORD(17030),
UWORD(131),
UWORD(1),
UWORD(120384786168259200),
UWORD(905148768182400),
UWORD(6754841553600),
UWORD(50035863360),
UWORD(367910760),
UWORD(2685480),
UWORD(19460),
UWORD(140),
UWORD(1),
UWORD(1346749373249280),
UWORD(9484150515840),
UWORD(66322730880),
UWORD(460574520),
UWORD(3176376),
UWORD(21756),
UWORD(148),
UWORD(1),
UWORD(1961463552048000),
UWORD(13076423680320),
UWORD(86598832320),
UWORD(569729160),
UWORD(3723720),
UWORD(24180),
UWORD(156),
UWORD(1),
UWORD(2802505908948480),
UWORD(17737379170560),
UWORD(111555843840),
UWORD(697224024),
UWORD(4330584),
UWORD(26732),
UWORD(164),
UWORD(1),
UWORD(3935446603320960),
UWORD(23707509658560),
UWORD(141961135680),
UWORD(845006760),
UWORD(5000040),
UWORD(29412),
UWORD(172),
UWORD(1),
UWORD(5440248896544000),
UWORD(31265798256000),
UWORD(178661704320),
UWORD(1015123320),
UWORD(5735160),
UWORD(32220),
UWORD(180),
UWORD(1),
UWORD(7413519413139840),
UWORD(40733623149120),
UWORD(222588104640),
UWORD(1209717960),
UWORD(6539016),
UWORD(35156),
UWORD(188),
UWORD(1),
UWORD(9970981685683200),
UWORD(52478850977280),
UWORD(274758382080),
UWORD(1431033240),
UWORD(7414680),
UWORD(38220),
UWORD(196),
UWORD(1),
UWORD(13250183553129600),
UWORD(66920118955200),
UWORD(336282004800),
UWORD(1681410024),
UWORD(8365224),
UWORD(41412),
UWORD(204),
UWORD(1),
UWORD(17413448982209280),
UWORD(84531305738880),
UWORD(408363795840),
UWORD(1963287480),
UWORD(9393720),
UWORD(44732),
UWORD(212),
UWORD(1),
UWORD(22651084881532800),
UWORD(105846191035200),
UWORD(492307865280),
UWORD(2279203080),
UWORD(10503240),
UWORD(48180),
UWORD(220),
UWORD(1),
UWORD(29184853478054400),
UWORD(131463303955200),
UWORD(589521542400),
UWORD(2631792600),
UWORD(11696856),
UWORD(51756),
UWORD(228),
UWORD(1),
UWORD(37271720825539200),
UWORD(162050960111040),
UWORD(701519307840),
UWORD(3023790120),
UWORD(12977640),
UWORD(55460),
UWORD(236),
UWORD(1),
UWORD(47207892014680320),
UWORD(198352487456640),
UWORD(829926725760),
UWORD(3458028024),
UWORD(14348664),
UWORD(59292),
UWORD(244),
UWORD(1),
UWORD(59333143654512000),
UWORD(241191640872000),
UWORD(976484376000),
UWORD(3937437000),
UWORD(15813000),
UWORD(63252),
UWORD(252),
UWORD(1),
UWORD(284751785364480),
UWORD(1121070021120),
UWORD(4396353024),
UWORD(17173254),
UWORD(66822),
UWORD(259),
UWORD(1),
UWORD(334679402201760),
UWORD(1282296560160),
UWORD(4894261680),
UWORD(18609360),
UWORD(70490),
UWORD(266),
UWORD(1),
UWORD(391698294099840),
UWORD(1461560798880),
UWORD(5433311520),
UWORD(20123376),
UWORD(74256),
UWORD(273),
UWORD(1),
UWORD(456592291848000),
UWORD(1660335606720),
UWORD(6015708720),
UWORD(21717360),
UWORD(78120),
UWORD(280),
UWORD(1),
UWORD(530208485286480),
UWORD(1880171933640),
UWORD(6643717080),
UWORD(23393370),
UWORD(82082),
UWORD(287),
UWORD(1),
};
ARB_DLL const mp_limb_t factorial_tab_denom[FACTORIAL_TAB_SIZE] = {
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(2432902008176640000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(3569119343741952000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(13776096431889792000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(5943699946888704000),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(765606216965990400),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(3463786592489664000),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(12849198336259084800),
UWORD(426381220061596800),
UWORD(426381220061596800),
UWORD(426381220061596800),
UWORD(426381220061596800),
UWORD(426381220061596800),
UWORD(426381220061596800),
UWORD(426381220061596800),
UWORD(426381220061596800),
UWORD(426381220061596800),
UWORD(997002729180057600),
UWORD(997002729180057600),
UWORD(997002729180057600),
UWORD(997002729180057600),
UWORD(997002729180057600),
UWORD(997002729180057600),
UWORD(997002729180057600),
UWORD(997002729180057600),
UWORD(997002729180057600),
UWORD(2166413361461395200),
UWORD(2166413361461395200),
UWORD(2166413361461395200),
UWORD(2166413361461395200),
UWORD(2166413361461395200),
UWORD(2166413361461395200),
UWORD(2166413361461395200),
UWORD(2166413361461395200),
UWORD(2166413361461395200),
UWORD(4425903681681081600),
UWORD(4425903681681081600),
UWORD(4425903681681081600),
UWORD(4425903681681081600),
UWORD(4425903681681081600),
UWORD(4425903681681081600),
UWORD(4425903681681081600),
UWORD(4425903681681081600),
UWORD(4425903681681081600),
UWORD(8578777490599680000),
UWORD(8578777490599680000),
UWORD(8578777490599680000),
UWORD(8578777490599680000),
UWORD(8578777490599680000),
UWORD(8578777490599680000),
UWORD(8578777490599680000),
UWORD(8578777490599680000),
UWORD(8578777490599680000),
UWORD(15890791774210214400),
UWORD(15890791774210214400),
UWORD(15890791774210214400),
UWORD(15890791774210214400),
UWORD(15890791774210214400),
UWORD(15890791774210214400),
UWORD(15890791774210214400),
UWORD(15890791774210214400),
UWORD(15890791774210214400),
UWORD(189891661628148480),
UWORD(189891661628148480),
UWORD(189891661628148480),
UWORD(189891661628148480),
UWORD(189891661628148480),
UWORD(189891661628148480),
UWORD(189891661628148480),
UWORD(189891661628148480),
UWORD(292258069255152000),
UWORD(292258069255152000),
UWORD(292258069255152000),
UWORD(292258069255152000),
UWORD(292258069255152000),
UWORD(292258069255152000),
UWORD(292258069255152000),
UWORD(292258069255152000),
UWORD(439993427704911360),
UWORD(439993427704911360),
UWORD(439993427704911360),
UWORD(439993427704911360),
UWORD(439993427704911360),
UWORD(439993427704911360),
UWORD(439993427704911360),
UWORD(439993427704911360),
UWORD(649348689547958400),
UWORD(649348689547958400),
UWORD(649348689547958400),
UWORD(649348689547958400),
UWORD(649348689547958400),
UWORD(649348689547958400),
UWORD(649348689547958400),
UWORD(649348689547958400),
UWORD(941163059102112000),
UWORD(941163059102112000),
UWORD(941163059102112000),
UWORD(941163059102112000),
UWORD(941163059102112000),
UWORD(941163059102112000),
UWORD(941163059102112000),
UWORD(941163059102112000),
UWORD(1341847013778311040),
UWORD(1341847013778311040),
UWORD(1341847013778311040),
UWORD(1341847013778311040),
UWORD(1341847013778311040),
UWORD(1341847013778311040),
UWORD(1341847013778311040),
UWORD(1341847013778311040),
UWORD(1884515538594124800),
UWORD(1884515538594124800),
UWORD(1884515538594124800),
UWORD(1884515538594124800),
UWORD(1884515538594124800),
UWORD(1884515538594124800),
UWORD(1884515538594124800),
UWORD(1884515538594124800),
UWORD(2610286159966531200),
UWORD(2610286159966531200),
UWORD(2610286159966531200),
UWORD(2610286159966531200),
UWORD(2610286159966531200),
UWORD(2610286159966531200),
UWORD(2610286159966531200),
UWORD(2610286159966531200),
UWORD(3569757041352902400),
UWORD(3569757041352902400),
UWORD(3569757041352902400),
UWORD(3569757041352902400),
UWORD(3569757041352902400),
UWORD(3569757041352902400),
UWORD(3569757041352902400),
UWORD(3569757041352902400),
UWORD(4824681079766486400),
UWORD(4824681079766486400),
UWORD(4824681079766486400),
UWORD(4824681079766486400),
UWORD(4824681079766486400),
UWORD(4824681079766486400),
UWORD(4824681079766486400),
UWORD(4824681079766486400),
UWORD(6449852618650022400),
UWORD(6449852618650022400),
UWORD(6449852618650022400),
UWORD(6449852618650022400),
UWORD(6449852618650022400),
UWORD(6449852618650022400),
UWORD(6449852618650022400),
UWORD(6449852618650022400),
UWORD(8535224069048476800),
UWORD(8535224069048476800),
UWORD(8535224069048476800),
UWORD(8535224069048476800),
UWORD(8535224069048476800),
UWORD(8535224069048476800),
UWORD(8535224069048476800),
UWORD(8535224069048476800),
UWORD(11188270407479235840),
UWORD(11188270407479235840),
UWORD(11188270407479235840),
UWORD(11188270407479235840),
UWORD(11188270407479235840),
UWORD(11188270407479235840),
UWORD(11188270407479235840),
UWORD(11188270407479235840),
UWORD(14536620195355440000),
UWORD(14536620195355440000),
UWORD(14536620195355440000),
UWORD(14536620195355440000),
UWORD(14536620195355440000),
UWORD(14536620195355440000),
UWORD(14536620195355440000),
UWORD(14536620195355440000),
UWORD(72042201697213440),
UWORD(72042201697213440),
UWORD(72042201697213440),
UWORD(72042201697213440),
UWORD(72042201697213440),
UWORD(72042201697213440),
UWORD(72042201697213440),
UWORD(87016644572457600),
UWORD(87016644572457600),
UWORD(87016644572457600),
UWORD(87016644572457600),
UWORD(87016644572457600),
UWORD(87016644572457600),
UWORD(87016644572457600),
UWORD(104583444524657280),
UWORD(104583444524657280),
UWORD(104583444524657280),
UWORD(104583444524657280),
UWORD(104583444524657280),
UWORD(104583444524657280),
UWORD(104583444524657280),
UWORD(125106287966352000),
UWORD(125106287966352000),
UWORD(125106287966352000),
UWORD(125106287966352000),
UWORD(125106287966352000),
UWORD(125106287966352000),
UWORD(125106287966352000),
UWORD(148988584365500880),
UWORD(148988584365500880),
UWORD(148988584365500880),
UWORD(148988584365500880),
UWORD(148988584365500880),
UWORD(148988584365500880),
UWORD(148988584365500880),
};
#else
ARB_DLL const mp_limb_t factorial_tab_numer[FACTORIAL_TAB_SIZE] = {
UWORD(479001600),
UWORD(479001600),
UWORD(239500800),
UWORD(79833600),
UWORD(19958400),
UWORD(3991680),
UWORD(665280),
UWORD(95040),
UWORD(11880),
UWORD(1320),
UWORD(132),
UWORD(12),
UWORD(1),
UWORD(19535040),
UWORD(1395360),
UWORD(93024),
UWORD(5814),
UWORD(342),
UWORD(19),
UWORD(1),
UWORD(165765600),
UWORD(7893600),
UWORD(358800),
UWORD(15600),
UWORD(650),
UWORD(26),
UWORD(1),
UWORD(24165120),
UWORD(863040),
UWORD(29760),
UWORD(992),
UWORD(32),
UWORD(1),
UWORD(60233040),
UWORD(1771560),
UWORD(50616),
UWORD(1406),
UWORD(38),
UWORD(1),
UWORD(2961840),
UWORD(74046),
UWORD(1806),
UWORD(43),
UWORD(1),
UWORD(4669920),
UWORD(103776),
UWORD(2256),
UWORD(48),
UWORD(1),
UWORD(7027800),
UWORD(140556),
UWORD(2756),
UWORD(53),
UWORD(1),
UWORD(10182480),
UWORD(185136),
UWORD(3306),
UWORD(58),
UWORD(1),
UWORD(14295960),
UWORD(238266),
UWORD(3906),
UWORD(63),
UWORD(1),
UWORD(19545240),
UWORD(300696),
UWORD(4556),
UWORD(68),
UWORD(1),
UWORD(26122320),
UWORD(373176),
UWORD(5256),
UWORD(73),
UWORD(1),
UWORD(34234200),
UWORD(456456),
UWORD(6006),
UWORD(78),
UWORD(1),
UWORD(44102880),
UWORD(551286),
UWORD(6806),
UWORD(83),
UWORD(1),
UWORD(635970),
UWORD(7482),
UWORD(87),
UWORD(1),
UWORD(728910),
UWORD(8190),
UWORD(91),
UWORD(1),
UWORD(830490),
UWORD(8930),
UWORD(95),
UWORD(1),
UWORD(941094),
UWORD(9702),
UWORD(99),
UWORD(1),
UWORD(1061106),
UWORD(10506),
UWORD(103),
UWORD(1),
UWORD(1190910),
UWORD(11342),
UWORD(107),
UWORD(1),
UWORD(1330890),
UWORD(12210),
UWORD(111),
UWORD(1),
UWORD(1481430),
UWORD(13110),
UWORD(115),
UWORD(1),
UWORD(1642914),
UWORD(14042),
UWORD(119),
UWORD(1),
UWORD(1815726),
UWORD(15006),
UWORD(123),
UWORD(1),
UWORD(2000250),
UWORD(16002),
UWORD(127),
UWORD(1),
UWORD(2196870),
UWORD(17030),
UWORD(131),
UWORD(1),
UWORD(2405970),
UWORD(18090),
UWORD(135),
UWORD(1),
UWORD(2627934),
UWORD(19182),
UWORD(139),
UWORD(1),
UWORD(2863146),
UWORD(20306),
UWORD(143),
UWORD(1),
UWORD(3111990),
UWORD(21462),
UWORD(147),
UWORD(1),
UWORD(3374850),
UWORD(22650),
UWORD(151),
UWORD(1),
UWORD(3652110),
UWORD(23870),
UWORD(155),
UWORD(1),
UWORD(3944154),
UWORD(25122),
UWORD(159),
UWORD(1),
UWORD(4251366),
UWORD(26406),
UWORD(163),
UWORD(1),
UWORD(4574130),
UWORD(27722),
UWORD(167),
UWORD(1),
UWORD(4912830),
UWORD(29070),
UWORD(171),
UWORD(1),
UWORD(5267850),
UWORD(30450),
UWORD(175),
UWORD(1),
UWORD(5639574),
UWORD(31862),
UWORD(179),
UWORD(1),
UWORD(6028386),
UWORD(33306),
UWORD(183),
UWORD(1),
UWORD(6434670),
UWORD(34782),
UWORD(187),
UWORD(1),
UWORD(6858810),
UWORD(36290),
UWORD(191),
UWORD(1),
UWORD(7301190),
UWORD(37830),
UWORD(195),
UWORD(1),
UWORD(7762194),
UWORD(39402),
UWORD(199),
UWORD(1),
UWORD(8242206),
UWORD(41006),
UWORD(203),
UWORD(1),
UWORD(8741610),
UWORD(42642),
UWORD(207),
UWORD(1),
UWORD(9260790),
UWORD(44310),
UWORD(211),
UWORD(1),
UWORD(9800130),
UWORD(46010),
UWORD(215),
UWORD(1),
UWORD(10360014),
UWORD(47742),
UWORD(219),
UWORD(1),
UWORD(10940826),
UWORD(49506),
UWORD(223),
UWORD(1),
UWORD(11542950),
UWORD(51302),
UWORD(227),
UWORD(1),
UWORD(12166770),
UWORD(53130),
UWORD(231),
UWORD(1),
UWORD(12812670),
UWORD(54990),
UWORD(235),
UWORD(1),
UWORD(13481034),
UWORD(56882),
UWORD(239),
UWORD(1),
UWORD(14172246),
UWORD(58806),
UWORD(243),
UWORD(1),
UWORD(14886690),
UWORD(60762),
UWORD(247),
UWORD(1),
UWORD(15624750),
UWORD(62750),
UWORD(251),
UWORD(1),
UWORD(16386810),
UWORD(64770),
UWORD(255),
UWORD(1),
UWORD(66306),
UWORD(258),
UWORD(1),
UWORD(67860),
UWORD(261),
UWORD(1),
UWORD(69432),
UWORD(264),
UWORD(1),
UWORD(71022),
UWORD(267),
UWORD(1),
UWORD(72630),
UWORD(270),
UWORD(1),
UWORD(74256),
UWORD(273),
UWORD(1),
UWORD(75900),
UWORD(276),
UWORD(1),
UWORD(77562),
UWORD(279),
UWORD(1),
UWORD(79242),
UWORD(282),
UWORD(1),
UWORD(80940),
UWORD(285),
UWORD(1),
UWORD(82656),
UWORD(288),
};
ARB_DLL const mp_limb_t factorial_tab_denom[FACTORIAL_TAB_SIZE] = {
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(479001600),
UWORD(253955520),
UWORD(253955520),
UWORD(253955520),
UWORD(253955520),
UWORD(253955520),
UWORD(253955520),
UWORD(253955520),
UWORD(3315312000),
UWORD(3315312000),
UWORD(3315312000),
UWORD(3315312000),
UWORD(3315312000),
UWORD(3315312000),
UWORD(3315312000),
UWORD(652458240),
UWORD(652458240),
UWORD(652458240),
UWORD(652458240),
UWORD(652458240),
UWORD(652458240),
UWORD(1987690320),
UWORD(1987690320),
UWORD(1987690320),
UWORD(1987690320),
UWORD(1987690320),
UWORD(1987690320),
UWORD(115511760),
UWORD(115511760),
UWORD(115511760),
UWORD(115511760),
UWORD(115511760),
UWORD(205476480),
UWORD(205476480),
UWORD(205476480),
UWORD(205476480),
UWORD(205476480),
UWORD(344362200),
UWORD(344362200),
UWORD(344362200),
UWORD(344362200),
UWORD(344362200),
UWORD(549853920),
UWORD(549853920),
UWORD(549853920),
UWORD(549853920),
UWORD(549853920),
UWORD(843461640),
UWORD(843461640),
UWORD(843461640),
UWORD(843461640),
UWORD(843461640),
UWORD(1250895360),
UWORD(1250895360),
UWORD(1250895360),
UWORD(1250895360),
UWORD(1250895360),
UWORD(1802440080),
UWORD(1802440080),
UWORD(1802440080),
UWORD(1802440080),
UWORD(1802440080),
UWORD(2533330800),
UWORD(2533330800),
UWORD(2533330800),
UWORD(2533330800),
UWORD(2533330800),
UWORD(3484127520),
UWORD(3484127520),
UWORD(3484127520),
UWORD(3484127520),
UWORD(3484127520),
UWORD(53421480),
UWORD(53421480),
UWORD(53421480),
UWORD(53421480),
UWORD(64144080),
UWORD(64144080),
UWORD(64144080),
UWORD(64144080),
UWORD(76405080),
UWORD(76405080),
UWORD(76405080),
UWORD(76405080),
UWORD(90345024),
UWORD(90345024),
UWORD(90345024),
UWORD(90345024),
UWORD(106110600),
UWORD(106110600),
UWORD(106110600),
UWORD(106110600),
UWORD(123854640),
UWORD(123854640),
UWORD(123854640),
UWORD(123854640),
UWORD(143736120),
UWORD(143736120),
UWORD(143736120),
UWORD(143736120),
UWORD(165920160),
UWORD(165920160),
UWORD(165920160),
UWORD(165920160),
UWORD(190578024),
UWORD(190578024),
UWORD(190578024),
UWORD(190578024),
UWORD(217887120),
UWORD(217887120),
UWORD(217887120),
UWORD(217887120),
UWORD(248031000),
UWORD(248031000),
UWORD(248031000),
UWORD(248031000),
UWORD(281199360),
UWORD(281199360),
UWORD(281199360),
UWORD(281199360),
UWORD(317588040),
UWORD(317588040),
UWORD(317588040),
UWORD(317588040),
UWORD(357399024),
UWORD(357399024),
UWORD(357399024),
UWORD(357399024),
UWORD(400840440),
UWORD(400840440),
UWORD(400840440),
UWORD(400840440),
UWORD(448126560),
UWORD(448126560),
UWORD(448126560),
UWORD(448126560),
UWORD(499477800),
UWORD(499477800),
UWORD(499477800),
UWORD(499477800),
UWORD(555120720),
UWORD(555120720),
UWORD(555120720),
UWORD(555120720),
UWORD(615288024),
UWORD(615288024),
UWORD(615288024),
UWORD(615288024),
UWORD(680218560),
UWORD(680218560),
UWORD(680218560),
UWORD(680218560),
UWORD(750157320),
UWORD(750157320),
UWORD(750157320),
UWORD(750157320),
UWORD(825355440),
UWORD(825355440),
UWORD(825355440),
UWORD(825355440),
UWORD(906070200),
UWORD(906070200),
UWORD(906070200),
UWORD(906070200),
UWORD(992565024),
UWORD(992565024),
UWORD(992565024),
UWORD(992565024),
UWORD(1085109480),
UWORD(1085109480),
UWORD(1085109480),
UWORD(1085109480),
UWORD(1183979280),
UWORD(1183979280),
UWORD(1183979280),
UWORD(1183979280),
UWORD(1289456280),
UWORD(1289456280),
UWORD(1289456280),
UWORD(1289456280),
UWORD(1401828480),
UWORD(1401828480),
UWORD(1401828480),
UWORD(1401828480),
UWORD(1521390024),
UWORD(1521390024),
UWORD(1521390024),
UWORD(1521390024),
UWORD(1648441200),
UWORD(1648441200),
UWORD(1648441200),
UWORD(1648441200),
UWORD(1783288440),
UWORD(1783288440),
UWORD(1783288440),
UWORD(1783288440),
UWORD(1926244320),
UWORD(1926244320),
UWORD(1926244320),
UWORD(1926244320),
UWORD(2077627560),
UWORD(2077627560),
UWORD(2077627560),
UWORD(2077627560),
UWORD(2237763024),
UWORD(2237763024),
UWORD(2237763024),
UWORD(2237763024),
UWORD(2406981720),
UWORD(2406981720),
UWORD(2406981720),
UWORD(2406981720),
UWORD(2585620800),
UWORD(2585620800),
UWORD(2585620800),
UWORD(2585620800),
UWORD(2774023560),
UWORD(2774023560),
UWORD(2774023560),
UWORD(2774023560),
UWORD(2972539440),
UWORD(2972539440),
UWORD(2972539440),
UWORD(2972539440),
UWORD(3181524024),
UWORD(3181524024),
UWORD(3181524024),
UWORD(3181524024),
UWORD(3401339040),
UWORD(3401339040),
UWORD(3401339040),
UWORD(3401339040),
UWORD(3632352360),
UWORD(3632352360),
UWORD(3632352360),
UWORD(3632352360),
UWORD(3874938000),
UWORD(3874938000),
UWORD(3874938000),
UWORD(3874938000),
UWORD(4129476120),
UWORD(4129476120),
UWORD(4129476120),
UWORD(4129476120),
UWORD(16974336),
UWORD(16974336),
UWORD(16974336),
UWORD(17575740),
UWORD(17575740),
UWORD(17575740),
UWORD(18191184),
UWORD(18191184),
UWORD(18191184),
UWORD(18820830),
UWORD(18820830),
UWORD(18820830),
UWORD(19464840),
UWORD(19464840),
UWORD(19464840),
UWORD(20123376),
UWORD(20123376),
UWORD(20123376),
UWORD(20796600),
UWORD(20796600),
UWORD(20796600),
UWORD(21484674),
UWORD(21484674),
UWORD(21484674),
UWORD(22187760),
UWORD(22187760),
UWORD(22187760),
UWORD(22906020),
UWORD(22906020),
UWORD(22906020),
UWORD(23639616),
UWORD(23639616),
};
#endif
void _arb_exp_taylor_rs(mp_ptr y, mp_limb_t * error,
mp_srcptr x, mp_size_t xn, ulong N)
{
mp_ptr s, t, xpow;
mp_limb_t new_denom, old_denom, c;
slong power, k, m;
TMP_INIT;
TMP_START;
if (N >= FACTORIAL_TAB_SIZE - 1)
{
flint_printf("_arb_exp_taylor_rs: N too large!\n");
flint_abort();
}
if (N <= 3)
{
if (N <= 1)
{
flint_mpn_zero(y, xn);
y[xn] = N;
error[0] = 0;
}
else if (N == 2)
{
flint_mpn_copyi(y, x, xn);
y[xn] = 1;
error[0] = 0;
}
else
{
/* 1 + x + x^2 / 2 */
t = TMP_ALLOC_LIMBS(2 * xn);
mpn_sqr(t, x, xn);
mpn_rshift(t + xn, t + xn, xn, 1);
y[xn] = mpn_add_n(y, x, t + xn, xn) + 1;
error[0] = 2;
}
}
else
{
/* Choose m ~= sqrt(num_terms) (m must be even, >= 2) */
/* TODO: drop evenness assumption since we don't have sign issues here? */
/* TODO: then just need to fix power construction below... */
m = 2;
while (m * m < N)
m += 2;
/* todo: merge allocations */
xpow = TMP_ALLOC_LIMBS((m + 1) * xn);
s = TMP_ALLOC_LIMBS(xn + 2);
t = TMP_ALLOC_LIMBS(2 * xn + 2); /* todo: 1 limb too much? */
/* higher index ---> */
/* | ---xn--- | */
/* xpow = | | x^m | x^(m-1) | ... | x^2 | x | */
#define XPOW_WRITE(__k) (xpow + (m - (__k)) * xn)
#define XPOW_READ(__k) (xpow + (m - (__k) + 1) * xn)
flint_mpn_copyi(XPOW_READ(1), x, xn);
mpn_sqr(XPOW_WRITE(2), XPOW_READ(1), xn);
for (k = 4; k <= m; k += 2)
{
mpn_mul_n(XPOW_WRITE(k - 1), XPOW_READ(k / 2), XPOW_READ(k / 2 - 1), xn);
mpn_sqr(XPOW_WRITE(k), XPOW_READ(k / 2), xn);
}
flint_mpn_zero(s, xn + 1);
/* todo: skip one nonscalar multiplication (use x^m)
when starting on x^0 */
power = (N - 1) % m;
for (k = N - 1; k >= 0; k--)
{
c = factorial_tab_numer[k];
new_denom = factorial_tab_denom[k];
old_denom = factorial_tab_denom[k+1];
/* change denominators */
if (new_denom != old_denom && k < N - 1)
{
mpn_divrem_1(s, 0, s, xn + 1, old_denom);
}
if (power == 0)
{
/* add c * x^0 -- only top limb is affected */
s[xn] += c;
/* Outer polynomial evaluation: multiply by x^m */
if (k != 0)
{
mpn_mul(t, s, xn + 1, XPOW_READ(m), xn);
flint_mpn_copyi(s, t + xn, xn + 1);
}
power = m - 1;
}
else
{
s[xn] += mpn_addmul_1(s, XPOW_READ(power), xn, c);
power--;
}
}
/* finally divide by denominator */
mpn_divrem_1(y, 0, s, xn + 1, factorial_tab_denom[0]);
/* error bound (ulp) */
error[0] = 2;
}
TMP_END;
}