mirror of
https://github.com/vale981/arb
synced 2025-03-06 09:51:39 -05:00
719 lines
30 KiB
C
719 lines
30 KiB
C
/*=============================================================================
|
|
|
|
This file is part of ARB.
|
|
|
|
ARB is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
ARB is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with ARB; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
=============================================================================*/
|
|
/******************************************************************************
|
|
|
|
Copyright (C) 2014 Fredrik Johansson
|
|
|
|
******************************************************************************/
|
|
|
|
#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");
|
|
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 = | <temp> | (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");
|
|
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;
|
|
}
|
|
|