/* 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; }