/*
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 ODD_RECIPROCAL_TAB_SIZE 256
#if FLINT_BITS == 64
const mp_limb_t odd_reciprocal_tab_numer[ODD_RECIPROCAL_TAB_SIZE] = {
UWORD(13835020108241056725), UWORD(4611673369413685575),
UWORD(2767004021648211345), UWORD(1976431444034436675),
UWORD(1537224456471228525), UWORD(1257729100749186975),
UWORD(1064232316018542825), UWORD(922334673882737115),
UWORD(813824712249473925), UWORD(728158953065318775),
UWORD(658810481344812225), UWORD(601522613401785075),
UWORD(553400804329642269), UWORD(512408152157076175),
UWORD(477069658904864025), UWORD(446290971233582475),
UWORD(419243033583062325), UWORD(395286288806887335),
UWORD(373919462384893425), UWORD(354744105339514275),
UWORD(337439514835147725), UWORD(321744653680024575),
UWORD(307444891294245705), UWORD(294362129962575675),
UWORD(43378025254434585), UWORD(41676926224848915),
UWORD(40104212027684805), UWORD(38645877044859903),
UWORD(37289881359075345), UWORD(36025817584191435),
UWORD(34844643237168765), UWORD(33738464086782455),
UWORD(32700357499496841), UWORD(31724227424884995),
UWORD(30804684600975285), UWORD(29936947006581615),
UWORD(18078521432946975), UWORD(17596427528068389),
UWORD(17139377462404275), UWORD(16705469172216825),
UWORD(16292988451915175), UWORD(15900386320543725),
UWORD(15526259583589755), UWORD(15169334075921025),
UWORD(14828450164102575), UWORD(14502550160495925),
UWORD(14190667361345475), UWORD(34099971069969189),
UWORD(33396878882959515), UWORD(32722194461081545),
UWORD(32074230214327455), UWORD(31451429627641485),
UWORD(30852354777591171), UWORD(30275675249038065),
UWORD(29720158271991495), UWORD(29184659924748405),
UWORD(28668117271213035), UWORD(70414222249896525),
UWORD(69210560331094875), UWORD(68047357636454625),
UWORD(66922607923455375), UWORD(65834435436895125),
UWORD(64781084469904803), UWORD(63760909911323625),
UWORD(62772368672388375), UWORD(61814011898764125),
UWORD(60884477885248875), UWORD(59982485620282225),
UWORD(22849011931010265), UWORD(22520249169412995),
UWORD(22200813010981605), UWORD(21890312129709135),
UWORD(21588376789989009), UWORD(21294657377880315),
UWORD(21008823050660445), UWORD(20730560493698055),
UWORD(20459572774826185), UWORD(11592603279646389),
UWORD(11444926804746435), UWORD(11300965461290505),
UWORD(11160580797175095), UWORD(11023641155491965),
UWORD(10890021262698123), UWORD(10759601846378385),
UWORD(10632269280149055), UWORD(10507915253480645),
UWORD(3812050066792275), UWORD(3768483780314649),
UWORD(3725902042683975), UWORD(3684271852262925),
UWORD(3643561666050075), UWORD(3603741319973025),
UWORD(3564781954351695), UWORD(3526655944144725),
UWORD(3489336833624675), UWORD(56769492397408245),
UWORD(56181207502098315), UWORD(55604989989256281),
UWORD(55040472324390735), UWORD(54487301748266205),
UWORD(53945139541815795), UWORD(53413660334507265),
UWORD(52892551453194999), UWORD(52381512308719685),
UWORD(7543627748528235), UWORD(7472124167973465),
UWORD(7401963377663855), UWORD(7333107904383261),
UWORD(7265521656416595), UWORD(7199169860467585),
UWORD(7134019002001815), UWORD(7070036768800005),
UWORD(827619730851221), UWORD(820327927055175),
UWORD(813163491011025), UWORD(806123114465475),
UWORD(799203602753325), UWORD(792401869963935),
UWORD(785714934352425), UWORD(779139913981275),
UWORD(1317621181161285), UWORD(1306776562386295),
UWORD(1296108998611713), UWORD(1285614188906355),
UWORD(1275287970521565), UWORD(1265126313385935),
UWORD(1255125314861145), UWORD(1245281194744587),
UWORD(30567046059275355), UWORD(30331007093566665),
UWORD(30098585583271135), UWORD(29869699000888845),
UWORD(29644267310316099), UWORD(29422212873534705),
UWORD(29203460361463815), UWORD(28987936668759285),
UWORD(438859621842675), UWORD(435667915502001),
UWORD(432522298783575), UWORD(429421780512725),
UWORD(426365397733275), UWORD(423352214710425),
UWORD(420381321975615), UWORD(417451835411325),
UWORD(22634811266652585), UWORD(22479245553479715),
UWORD(22325803604309205), UWORD(22174442223941007),
UWORD(22025119380682145), UWORD(21877794167433435),
UWORD(21732426764327565), UWORD(21588978402846855),
UWORD(19609694213279247), UWORD(19481943762378405),
UWORD(19355847038997315), UWORD(19231372138424985),
UWORD(19108487971406295), UWORD(18987164238254509),
UWORD(18867371403943755), UWORD(18749080674138465),
UWORD(9266890993958325), UWORD(9209510863964775),
UWORD(9152836950955761), UWORD(9096856296821475),
UWORD(9041556258542925), UWORD(8986924498672575),
UWORD(8932948976158025), UWORD(8879617937494395),
UWORD(552205768818165), UWORD(548947917674695),
UWORD(545728281793905), UWORD(542546192687235),
UWORD(539400997367309), UWORD(536292057901215),
UWORD(533218750979145), UWORD(17071036886667995),
UWORD(16974317130936165), UWORD(16878687175268919),
UWORD(16784128703698785), UWORD(16690623808413555),
UWORD(16598154978450045), UWORD(16506705088761615),
UWORD(16416257389645113), UWORD(912010168967625),
UWORD(907067024420375), UWORD(902177175232125),
UWORD(897339764104875), UWORD(892553952029649),
UWORD(887818917801375), UWORD(883133857549125),
UWORD(29941527972993945), UWORD(29785175346503115),
UWORD(29630447162884917), UWORD(29477318236978535),
UWORD(29325763901569905), UWORD(29175759994144995),
UWORD(29027282844047565), UWORD(28880309260027071),
UWORD(1449018065980485), UWORD(1441754817529455),
UWORD(1434564020434545), UWORD(1427444596015515),
UWORD(1420395486899389), UWORD(1413415656496935),
UWORD(1406504088494505), UWORD(592554335551395),
UWORD(589684823030565), UWORD(586842968461743),
UWORD(584028373888785), UWORD(581240648953755),
UWORD(578479410716445), UWORD(575744283479015),
UWORD(433241218467057), UWORD(431211985593675),
UWORD(429201673306525), UWORD(427210018209975),
UWORD(425236761774825), UWORD(423281650226435),
UWORD(421344434435925), UWORD(2623079648743785),
UWORD(2611183595915015), UWORD(2599394956655805),
UWORD(2587712282693307), UWORD(2576134151674545),
UWORD(2564659166589135), UWORD(2553285955207365),
UWORD(210505107582315), UWORD(209579810406129),
UWORD(208662612111135), UWORD(207753406829605),
UWORD(206852090530995), UWORD(205958560982265),
UWORD(205072717709223), UWORD(3779907202434825),
UWORD(3763788195174975), UWORD(3747806079696525),
UWORD(3731959119528675), UWORD(3716245607446449),
UWORD(3700663864857575), UWORD(3685212241204725),
UWORD(4501257379467765), UWORD(4482618632554855),
UWORD(4464133607265969), UWORD(4445800409700195),
UWORD(4427617176940685), UWORD(4409582076423615),
UWORD(4391693305322505), UWORD(355589942551207),
UWORD(354158997108345), UWORD(352739522170035),
UWORD(351331380364965), UWORD(349934436506655),
UWORD(348548557550193), UWORD(347173612549995),
UWORD(6291002587483845), UWORD(6266380268159055),
};
const mp_limb_t odd_reciprocal_tab_denom[ODD_RECIPROCAL_TAB_SIZE] = {
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(13835020108241056725), UWORD(13835020108241056725),
UWORD(2125523237467294665), UWORD(2125523237467294665),
UWORD(2125523237467294665), UWORD(2125523237467294665),
UWORD(2125523237467294665), UWORD(2125523237467294665),
UWORD(2125523237467294665), UWORD(2125523237467294665),
UWORD(2125523237467294665), UWORD(2125523237467294665),
UWORD(2125523237467294665), UWORD(2125523237467294665),
UWORD(1319732064605129175), UWORD(1319732064605129175),
UWORD(1319732064605129175), UWORD(1319732064605129175),
UWORD(1319732064605129175), UWORD(1319732064605129175),
UWORD(1319732064605129175), UWORD(1319732064605129175),
UWORD(1319732064605129175), UWORD(1319732064605129175),
UWORD(1319732064605129175), UWORD(3239497251647072955),
UWORD(3239497251647072955), UWORD(3239497251647072955),
UWORD(3239497251647072955), UWORD(3239497251647072955),
UWORD(3239497251647072955), UWORD(3239497251647072955),
UWORD(3239497251647072955), UWORD(3239497251647072955),
UWORD(3239497251647072955), UWORD(8097635558738100375),
UWORD(8097635558738100375), UWORD(8097635558738100375),
UWORD(8097635558738100375), UWORD(8097635558738100375),
UWORD(8097635558738100375), UWORD(8097635558738100375),
UWORD(8097635558738100375), UWORD(8097635558738100375),
UWORD(8097635558738100375), UWORD(8097635558738100375),
UWORD(3130314634548406305), UWORD(3130314634548406305),
UWORD(3130314634548406305), UWORD(3130314634548406305),
UWORD(3130314634548406305), UWORD(3130314634548406305),
UWORD(3130314634548406305), UWORD(3130314634548406305),
UWORD(3130314634548406305), UWORD(1796853508345190295),
UWORD(1796853508345190295), UWORD(1796853508345190295),
UWORD(1796853508345190295), UWORD(1796853508345190295),
UWORD(1796853508345190295), UWORD(1796853508345190295),
UWORD(1796853508345190295), UWORD(1796853508345190295),
UWORD(659484661555063575), UWORD(659484661555063575),
UWORD(659484661555063575), UWORD(659484661555063575),
UWORD(659484661555063575), UWORD(659484661555063575),
UWORD(659484661555063575), UWORD(659484661555063575),
UWORD(659484661555063575), UWORD(10842973047904974795),
UWORD(10842973047904974795), UWORD(10842973047904974795),
UWORD(10842973047904974795), UWORD(10842973047904974795),
UWORD(10842973047904974795), UWORD(10842973047904974795),
UWORD(10842973047904974795), UWORD(10842973047904974795),
UWORD(1576618199442401115), UWORD(1576618199442401115),
UWORD(1576618199442401115), UWORD(1576618199442401115),
UWORD(1576618199442401115), UWORD(1576618199442401115),
UWORD(1576618199442401115), UWORD(1576618199442401115),
UWORD(186214439441524725), UWORD(186214439441524725),
UWORD(186214439441524725), UWORD(186214439441524725),
UWORD(186214439441524725), UWORD(186214439441524725),
UWORD(186214439441524725), UWORD(186214439441524725),
UWORD(317546704659869685), UWORD(317546704659869685),
UWORD(317546704659869685), UWORD(317546704659869685),
UWORD(317546704659869685), UWORD(317546704659869685),
UWORD(317546704659869685), UWORD(317546704659869685),
UWORD(7855730837233766235), UWORD(7855730837233766235),
UWORD(7855730837233766235), UWORD(7855730837233766235),
UWORD(7855730837233766235), UWORD(7855730837233766235),
UWORD(7855730837233766235), UWORD(7855730837233766235),
UWORD(119808676763050275), UWORD(119808676763050275),
UWORD(119808676763050275), UWORD(119808676763050275),
UWORD(119808676763050275), UWORD(119808676763050275),
UWORD(119808676763050275), UWORD(119808676763050275),
UWORD(6541460456062597065), UWORD(6541460456062597065),
UWORD(6541460456062597065), UWORD(6541460456062597065),
UWORD(6541460456062597065), UWORD(6541460456062597065),
UWORD(6541460456062597065), UWORD(6541460456062597065),
UWORD(5980956735050170335), UWORD(5980956735050170335),
UWORD(5980956735050170335), UWORD(5980956735050170335),
UWORD(5980956735050170335), UWORD(5980956735050170335),
UWORD(5980956735050170335), UWORD(5980956735050170335),
UWORD(2974672009060622325), UWORD(2974672009060622325),
UWORD(2974672009060622325), UWORD(2974672009060622325),
UWORD(2974672009060622325), UWORD(2974672009060622325),
UWORD(2974672009060622325), UWORD(2974672009060622325),
UWORD(186093344091721605), UWORD(186093344091721605),
UWORD(186093344091721605), UWORD(186093344091721605),
UWORD(186093344091721605), UWORD(186093344091721605),
UWORD(186093344091721605), UWORD(5991933947220466245),
UWORD(5991933947220466245), UWORD(5991933947220466245),
UWORD(5991933947220466245), UWORD(5991933947220466245),
UWORD(5991933947220466245), UWORD(5991933947220466245),
UWORD(5991933947220466245), UWORD(334707732011118375),
UWORD(334707732011118375), UWORD(334707732011118375),
UWORD(334707732011118375), UWORD(334707732011118375),
UWORD(334707732011118375), UWORD(334707732011118375),
UWORD(11407722157710693045), UWORD(11407722157710693045),
UWORD(11407722157710693045), UWORD(11407722157710693045),
UWORD(11407722157710693045), UWORD(11407722157710693045),
UWORD(11407722157710693045), UWORD(11407722157710693045),
UWORD(575260172194252545), UWORD(575260172194252545),
UWORD(575260172194252545), UWORD(575260172194252545),
UWORD(575260172194252545), UWORD(575260172194252545),
UWORD(575260172194252545), UWORD(243539831911623345),
UWORD(243539831911623345), UWORD(243539831911623345),
UWORD(243539831911623345), UWORD(243539831911623345),
UWORD(243539831911623345), UWORD(243539831911623345),
UWORD(184127517848499225), UWORD(184127517848499225),
UWORD(184127517848499225), UWORD(184127517848499225),
UWORD(184127517848499225), UWORD(184127517848499225),
UWORD(184127517848499225), UWORD(1151531965798521615),
UWORD(1151531965798521615), UWORD(1151531965798521615),
UWORD(1151531965798521615), UWORD(1151531965798521615),
UWORD(1151531965798521615), UWORD(1151531965798521615),
UWORD(95358813734788695), UWORD(95358813734788695),
UWORD(95358813734788695), UWORD(95358813734788695),
UWORD(95358813734788695), UWORD(95358813734788695),
UWORD(95358813734788695), UWORD(1765216663537063275),
UWORD(1765216663537063275), UWORD(1765216663537063275),
UWORD(1765216663537063275), UWORD(1765216663537063275),
UWORD(1765216663537063275), UWORD(1765216663537063275),
UWORD(2165104799523994965), UWORD(2165104799523994965),
UWORD(2165104799523994965), UWORD(2165104799523994965),
UWORD(2165104799523994965), UWORD(2165104799523994965),
UWORD(2165104799523994965), UWORD(176017021562847465),
UWORD(176017021562847465), UWORD(176017021562847465),
UWORD(176017021562847465), UWORD(176017021562847465),
UWORD(176017021562847465), UWORD(176017021562847465),
UWORD(3202120317029277105), UWORD(3202120317029277105),
};
#else
const mp_limb_t odd_reciprocal_tab_numer[ODD_RECIPROCAL_TAB_SIZE] = {
UWORD(1673196525), UWORD(557732175),
UWORD(334639305), UWORD(239028075),
UWORD(185910725), UWORD(152108775),
UWORD(128707425), UWORD(111546435),
UWORD(98423325), UWORD(88062975),
UWORD(79676025), UWORD(72747675),
UWORD(66927861), UWORD(12806255),
UWORD(11923065), UWORD(11153835),
UWORD(10477845), UWORD(9879111),
UWORD(9345105), UWORD(60902835),
UWORD(57931965), UWORD(55237455),
UWORD(52782457), UWORD(50536395),
UWORD(48473685), UWORD(3267715),
UWORD(3144405), UWORD(3030063),
UWORD(2923745), UWORD(2824635),
UWORD(6310395), UWORD(6110065),
UWORD(5922063), UWORD(5745285),
UWORD(5578755), UWORD(33304425),
UWORD(32391975), UWORD(31528189),
UWORD(30709275), UWORD(29931825),
UWORD(18208955), UWORD(17770185),
UWORD(17352063), UWORD(16953165),
UWORD(16572195), UWORD(28280835),
UWORD(27672645), UWORD(27090063),
UWORD(26531505), UWORD(25995515),
UWORD(1157205), UWORD(1134735),
UWORD(1113121), UWORD(1092315),
UWORD(1442445), UWORD(1416455),
UWORD(1391385), UWORD(1367187),
UWORD(590359), UWORD(580437),
UWORD(570843), UWORD(561561),
UWORD(2146173), UWORD(2112375),
UWORD(2079625), UWORD(2047875),
UWORD(2570805), UWORD(2532719),
UWORD(2495745), UWORD(2459835),
UWORD(1016015), UWORD(1001805),
UWORD(987987), UWORD(974545),
UWORD(3580965), UWORD(3533535),
UWORD(3487345), UWORD(3442347),
UWORD(4172637), UWORD(4120151),
UWORD(4068969), UWORD(4019043),
UWORD(1608711), UWORD(1589445),
UWORD(1570635), UWORD(1552265),
UWORD(5544525), UWORD(5481159),
UWORD(5419225), UWORD(5358675),
UWORD(6330885), UWORD(6261695),
UWORD(6194001), UWORD(6127755),
UWORD(2396095), UWORD(2371005),
UWORD(2346435), UWORD(2322369),
UWORD(8119797), UWORD(8038191),
UWORD(7958209), UWORD(7879803),
UWORD(9128493), UWORD(9040295),
UWORD(8953785), UWORD(8868915),
UWORD(3405815), UWORD(3374133),
UWORD(3343035), UWORD(3312505),
UWORD(11389725), UWORD(11287575),
UWORD(11187241), UWORD(11088675),
UWORD(12648405), UWORD(12538895),
UWORD(12431265), UWORD(12325467),
UWORD(4665519), UWORD(4626477),
UWORD(4588083), UWORD(4550321),
UWORD(15437253), UWORD(15312255),
UWORD(15189265), UWORD(15068235),
UWORD(16973565), UWORD(16840439),
UWORD(16709385), UWORD(16580355),
UWORD(6202855), UWORD(6155685),
UWORD(6109227), UWORD(6063465),
UWORD(73983), UWORD(73437),
UWORD(72899), UWORD(77283),
UWORD(76725), UWORD(76175),
UWORD(80655), UWORD(80085),
UWORD(79523), UWORD(84099),
UWORD(83517), UWORD(82943),
UWORD(87615), UWORD(87021),
UWORD(86435), UWORD(91203),
UWORD(90597), UWORD(89999),
UWORD(94863), UWORD(94245),
UWORD(93635), UWORD(98595),
UWORD(97965), UWORD(97343),
UWORD(102399), UWORD(101757),
UWORD(101123), UWORD(106275),
UWORD(105621), UWORD(104975),
UWORD(110223), UWORD(109557),
UWORD(108899), UWORD(114243),
UWORD(113565), UWORD(112895),
UWORD(118335), UWORD(117645),
UWORD(116963), UWORD(122499),
UWORD(121797), UWORD(121103),
UWORD(126735), UWORD(126021),
UWORD(125315), UWORD(131043),
UWORD(130317), UWORD(129599),
UWORD(135423), UWORD(134685),
UWORD(133955), UWORD(139875),
UWORD(139125), UWORD(138383),
UWORD(144399), UWORD(143637),
UWORD(142883), UWORD(148995),
UWORD(148221), UWORD(147455),
UWORD(153663), UWORD(152877),
UWORD(152099), UWORD(158403),
UWORD(157605), UWORD(156815),
UWORD(163215), UWORD(162405),
UWORD(161603), UWORD(168099),
UWORD(167277), UWORD(166463),
UWORD(173055), UWORD(172221),
UWORD(171395), UWORD(178083),
UWORD(177237), UWORD(176399),
UWORD(183183), UWORD(182325),
UWORD(181475), UWORD(188355),
UWORD(187485), UWORD(186623),
UWORD(193599), UWORD(192717),
UWORD(191843), UWORD(198915),
UWORD(198021), UWORD(197135),
UWORD(204303), UWORD(203397),
UWORD(202499), UWORD(209763),
UWORD(208845), UWORD(207935),
UWORD(215295), UWORD(214365),
UWORD(213443), UWORD(220899),
UWORD(219957), UWORD(219023),
UWORD(226575), UWORD(225621),
UWORD(224675), UWORD(232323),
UWORD(231357), UWORD(230399),
UWORD(238143), UWORD(237165),
UWORD(236195), UWORD(244035),
UWORD(243045), UWORD(242063),
UWORD(249999), UWORD(248997),
UWORD(248003), UWORD(256035),
UWORD(255021), UWORD(254015),
UWORD(262143), UWORD(261117),
};
const mp_limb_t odd_reciprocal_tab_denom[ODD_RECIPROCAL_TAB_SIZE] = {
UWORD(1673196525), UWORD(1673196525),
UWORD(1673196525), UWORD(1673196525),
UWORD(1673196525), UWORD(1673196525),
UWORD(1673196525), UWORD(1673196525),
UWORD(1673196525), UWORD(1673196525),
UWORD(1673196525), UWORD(1673196525),
UWORD(1673196525), UWORD(345768885),
UWORD(345768885), UWORD(345768885),
UWORD(345768885), UWORD(345768885),
UWORD(345768885), UWORD(2375210565),
UWORD(2375210565), UWORD(2375210565),
UWORD(2375210565), UWORD(2375210565),
UWORD(2375210565), UWORD(166653465),
UWORD(166653465), UWORD(166653465),
UWORD(166653465), UWORD(166653465),
UWORD(384934095), UWORD(384934095),
UWORD(384934095), UWORD(384934095),
UWORD(384934095), UWORD(2364614175),
UWORD(2364614175), UWORD(2364614175),
UWORD(2364614175), UWORD(2364614175),
UWORD(1474925355), UWORD(1474925355),
UWORD(1474925355), UWORD(1474925355),
UWORD(1474925355), UWORD(2573555985),
UWORD(2573555985), UWORD(2573555985),
UWORD(2573555985), UWORD(2573555985),
UWORD(116877705), UWORD(116877705),
UWORD(116877705), UWORD(116877705),
UWORD(157226505), UWORD(157226505),
UWORD(157226505), UWORD(157226505),
UWORD(69072003), UWORD(69072003),
UWORD(69072003), UWORD(69072003),
UWORD(268271625), UWORD(268271625),
UWORD(268271625), UWORD(268271625),
UWORD(341917065), UWORD(341917065),
UWORD(341917065), UWORD(341917065),
UWORD(143258115), UWORD(143258115),
UWORD(143258115), UWORD(143258115),
UWORD(533563785), UWORD(533563785),
UWORD(533563785), UWORD(533563785),
UWORD(655104009), UWORD(655104009),
UWORD(655104009), UWORD(655104009),
UWORD(265437315), UWORD(265437315),
UWORD(265437315), UWORD(265437315),
UWORD(959202825), UWORD(959202825),
UWORD(959202825), UWORD(959202825),
UWORD(1145890185), UWORD(1145890185),
UWORD(1145890185), UWORD(1145890185),
UWORD(452861955), UWORD(452861955),
UWORD(452861955), UWORD(452861955),
UWORD(1599600009), UWORD(1599600009),
UWORD(1599600009), UWORD(1599600009),
UWORD(1871341065), UWORD(1871341065),
UWORD(1871341065), UWORD(1871341065),
UWORD(725438595), UWORD(725438595),
UWORD(725438595), UWORD(725438595),
UWORD(2517129225), UWORD(2517129225),
UWORD(2517129225), UWORD(2517129225),
UWORD(2896484745), UWORD(2896484745),
UWORD(2896484745), UWORD(2896484745),
UWORD(1105728003), UWORD(1105728003),
UWORD(1105728003), UWORD(1105728003),
UWORD(3782126985), UWORD(3782126985),
UWORD(3782126985), UWORD(3782126985),
UWORD(4294311945), UWORD(4294311945),
UWORD(4294311945), UWORD(4294311945),
UWORD(1618945155), UWORD(1618945155),
UWORD(1618945155), UWORD(1618945155),
UWORD(19901427), UWORD(19901427),
UWORD(19901427), UWORD(21252825),
UWORD(21252825), UWORD(21252825),
UWORD(22664055), UWORD(22664055),
UWORD(22664055), UWORD(24136413),
UWORD(24136413), UWORD(24136413),
UWORD(25671195), UWORD(25671195),
UWORD(25671195), UWORD(27269697),
UWORD(27269697), UWORD(27269697),
UWORD(28933215), UWORD(28933215),
UWORD(28933215), UWORD(30663045),
UWORD(30663045), UWORD(30663045),
UWORD(32460483), UWORD(32460483),
UWORD(32460483), UWORD(34326825),
UWORD(34326825), UWORD(34326825),
UWORD(36263367), UWORD(36263367),
UWORD(36263367), UWORD(38271405),
UWORD(38271405), UWORD(38271405),
UWORD(40352235), UWORD(40352235),
UWORD(40352235), UWORD(42507153),
UWORD(42507153), UWORD(42507153),
UWORD(44737455), UWORD(44737455),
UWORD(44737455), UWORD(47044437),
UWORD(47044437), UWORD(47044437),
UWORD(49429395), UWORD(49429395),
UWORD(49429395), UWORD(51893625),
UWORD(51893625), UWORD(51893625),
UWORD(54438423), UWORD(54438423),
UWORD(54438423), UWORD(57065085),
UWORD(57065085), UWORD(57065085),
UWORD(59774907), UWORD(59774907),
UWORD(59774907), UWORD(62569185),
UWORD(62569185), UWORD(62569185),
UWORD(65449215), UWORD(65449215),
UWORD(65449215), UWORD(68416293),
UWORD(68416293), UWORD(68416293),
UWORD(71471715), UWORD(71471715),
UWORD(71471715), UWORD(74616777),
UWORD(74616777), UWORD(74616777),
UWORD(77852775), UWORD(77852775),
UWORD(77852775), UWORD(81181005),
UWORD(81181005), UWORD(81181005),
UWORD(84602763), UWORD(84602763),
UWORD(84602763), UWORD(88119345),
UWORD(88119345), UWORD(88119345),
UWORD(91732047), UWORD(91732047),
UWORD(91732047), UWORD(95442165),
UWORD(95442165), UWORD(95442165),
UWORD(99250995), UWORD(99250995),
UWORD(99250995), UWORD(103159833),
UWORD(103159833), UWORD(103159833),
UWORD(107169975), UWORD(107169975),
UWORD(107169975), UWORD(111282717),
UWORD(111282717), UWORD(111282717),
UWORD(115499355), UWORD(115499355),
UWORD(115499355), UWORD(119821185),
UWORD(119821185), UWORD(119821185),
UWORD(124249503), UWORD(124249503),
UWORD(124249503), UWORD(128785605),
UWORD(128785605), UWORD(128785605),
UWORD(133430787), UWORD(133430787),
};
#endif
void _arb_atan_taylor_rs(mp_ptr y, mp_limb_t * error,
mp_srcptr x, mp_size_t xn, ulong N, int alternating)
{
mp_ptr s, t, xpow;
mp_limb_t new_denom, old_denom, c;
slong power, k, m;
TMP_INIT;
TMP_START;
if (N >= ODD_RECIPROCAL_TAB_SIZE)
{
flint_printf("_arb_atan_taylor_rs: N too large!\n");
flint_abort();
}
if (N <= 2)
{
if (N == 0)
{
flint_mpn_zero(y, xn);
error[0] = 0;
}
else if (N == 1)
{
flint_mpn_copyi(y, x, xn);
error[0] = 0;
}
else
{
t = TMP_ALLOC_LIMBS(3 * xn);
/* x * (1 - x^2 / 3) */
/* higher index ---> */
/* t = | | x^2 (lo) | x^2 (hi) | */
mpn_sqr(t + xn, x, xn);
/* t = | x^3 (lo) | x^3 (hi) | x^2 (hi) | */
mpn_mul_n(t, t + 2 * xn, x, xn);
/* y = x - x^3 / 3 */
mpn_divrem_1(t, 0, t + xn, xn, 3);
if (alternating)
mpn_sub_n(y, x, t, xn);
else
mpn_add_n(y, x, t, xn);
error[0] = 3;
}
}
else
{
/* Choose m ~= sqrt(num_terms) (m must be even, >= 2) */
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^2)^m | (x^2)^(m-1) | ... | (x^2)^2 | x^2 | */
#define XPOW_WRITE(__k) (xpow + (m - (__k)) * xn)
#define XPOW_READ(__k) (xpow + (m - (__k) + 1) * xn)
mpn_sqr(XPOW_WRITE(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 = odd_reciprocal_tab_numer[k];
new_denom = odd_reciprocal_tab_denom[k];
old_denom = odd_reciprocal_tab_denom[k+1];
/* change denominators */
if (new_denom != old_denom && k < N - 1)
{
/* hack when s is negative: add 1 to get a positive number */
if (alternating && (k % 2 == 0))
s[xn] += old_denom;
/* multiply by new denominator */
s[xn + 1] = mpn_mul_1(s, s, xn + 1, new_denom);
/* divide by old denominator */
mpn_divrem_1(s, 0, s, xn + 2, old_denom);
if (s[xn + 1] != 0)
{
flint_printf("bad division!\n");
flint_abort();
}
/* subtract 1 */
if (alternating && (k % 2 == 0))
s[xn] -= new_denom;
}
if (power == 0)
{
/* sub/add c * x^0 -- only top limb is affected */
if (alternating & k)
s[xn] -= c;
else
s[xn] += c;
/* Outer polynomial evaluation: multiply by (x^2)^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
{
if (alternating & k)
s[xn] -= mpn_submul_1(s, XPOW_READ(power), xn, c);
else
s[xn] += mpn_addmul_1(s, XPOW_READ(power), xn, c);
power--;
}
}
/* finally divide by denominator and multiply by x */
mpn_divrem_1(s, 0, s, xn + 1, odd_reciprocal_tab_denom[0]);
mpn_mul(t, s, xn + 1, x, xn);
flint_mpn_copyi(y, t + xn, xn);
/* error bound (ulp) */
error[0] = 2;
}
TMP_END;
}