hmath/ratio/
ln2.rs

1use crate::{BigInt, Ratio};
2
3/// It returns an approximate value of ln(2).
4/// It gets more and more accurate as `k` gets bigger.
5/// For now, `k` should be less than 200.
6pub fn ln2_iter(k: usize) -> Ratio {
7    let mut result = Ratio::from_denom_and_numer_i32(11354112, 7869871);
8    let mut coeff = BigInt::from_i64(4096);
9
10    for i in 0..k {
11        let (denom, numer) = LN2_TABLE[i];
12        let curr = Ratio::from_denom_and_numer_raw(BigInt::from_i64(denom), BigInt::from_i64(numer));
13        result.add_rat_mut(&curr.div_bi(&coeff));
14        coeff.mul_i32_mut(64);
15    }
16
17    result
18}
19
20const LN2_TABLE: [(i64, i64); 205] = [
21    //(1920, 1327),
22    //(887040, 112619),
23    (17821440, 1270037),
24    (258424320, 12822709),
25    (228009600, 8681597),
26    (467470080, 14442269),
27    (2517977280, 65453077),
28    (23561303040, 528635839),
29    (49588156800, 978669859),
30    (1922452224, 33865613),
31    (87224417280, 1387494551),
32    (299978703360, 4349920153),
33    (493155062400, 6570252229),
34    (195111141120, 2404166671),
35    (29885502240, 342519931),
36    (1779932743680, 19067679427),
37    (2585373436800, 25998200023),
38    (1837012020480, 17405773247),
39    (2560249063680, 22933828217),
40    (1402654256640, 11913933401),
41    (9456301008000, 76366364377),
42    (785671011840, 6047164573),
43    (4124179039680, 30320476471),
44    (21395259325440, 150548612359),
45    (5490048278400, 37042125839),
46    (17435231573760, 112990864601),
47    (21945903920640, 136818015419),
48    (54779488135680, 329010447649),
49    (67830382638720, 393007137709),
50    (4168773100800, 23329797653),
51    (1590348510660, 8606513893),
52    (123457702072320, 646782534283),
53    (148850353491840, 755680519039),
54    (89226825273600, 439387982867),
55    (4256171023104, 20348278757),
56    (252506543132160, 1173021889477),
57    (298192697362560, 1347112114753),
58    (43821101318400, 192660524663),
59    (102599159382720, 439306864921),
60    (95700242641920, 399344682563),
61    (555774264017280, 2261648205427),
62    (321588854496000, 1276987536749),
63    (370873625210880, 1437888394847),
64    (852596054069760, 3229228112809),
65    (195383703795840, 723321647441),
66    (278998534214400, 1010075810563),
67    (158898930130080, 562851067721),
68    (1443972045035520, 5006731333459),
69    (1635894770643840, 5554793048359),
70    (184861986566400, 614983180027),
71    (1041956655586560, 3397402417601),
72    (2343651218388480, 7492790980813),
73    (2629824315108480, 8246993095849),
74    (92016953804160, 283148141237),
75    (164501980843200, 496874576063),
76    (3668677992483840, 10880835749527),
77    (4082953498715520, 11894496681883),
78    (2267750189080320, 6491167037057),
79    (2514548144908800, 7074173204867),
80    (222666696903168, 615866933977),
81    (6151293698309760, 16731598180477),
82    (1696553516125440, 4539387566557),
83    (467176992282000, 1229944218469),
84    (8220720369377280, 21300998732059),
85    (1805525643841920, 4605621252803),
86    (4949742597085440, 12432734126651),
87    (5420203947513600, 13409140592549),
88    (11854705585282560, 28891902317269),
89    (12946886110892160, 31091852129809),
90    (353041547738880, 835595419357),
91    (3845989027396800, 8973412630813),
92    (16738908718371840, 38507378219743),
93    (18191882900392320, 41271197726659),
94    (9874235672421120, 22095741188117),
95    (2141450272281600, 4727478341947),
96    (23196048234078720, 50527832475577),
97    (25099428243415680, 53957543981413),
98    (6782804751640320, 14392754410231),
99    (3662282435713440, 7671942609323),
100    (6321531650918400, 13075718253767),
101    (34066800493165440, 69587839025527),
102    (18341677535919360, 37005574705679),
103    (19732640862654720, 39328292603657),
104    (42420838315968000, 83532409158109),
105    (1822343527475328, 3545883456865),
106    (3055462975272960, 5875580438647),
107    (13104123322530240, 24906972070207),
108    (56155370042956800, 105511977303079),
109    (60113898450103680, 111670853390059),
110    (6430228268808960, 11811403050709),
111    (34365539206602240, 62425619864651),
112    (73411200741542400, 131892431691073),
113    (78353932318623360, 139247779035469),
114    (20892732869648640, 36731919715921),
115    (556714003081320, 968392219903),
116    (94876293909196800, 163303861363627),
117    (100989926978183040, 172022082573343),
118    (53714192086114560, 90554369120867),
119    (57102663895960320, 95287692251117),
120    (24266969332569600, 40086763328609),
121    (128831464921864320, 210696071556577),
122    (17088768861615360, 27671803773611),
123    (36246581513123520, 58120354997281),
124    (153675874084561920, 244029817358959),
125    (32559030005040000, 51206530020407),
126    (86180494748363520, 134251599936701),
127    (91195359015720960, 140727502314479),
128    (192902160484938240, 294901861074889),
129    (203913650538998400, 308857827117109),
130    (2154440402940672, 3233372243107),
131    (28439088743913120, 42294330038669),
132    (240139577584220160, 353924931314803),
133    (253345108999881600, 370063224526279),
134    (133575163844855040, 193392460294967),
135    (28157682486984960, 40410569604829),
136    (296646769611118080, 422041505789677),
137    (312382919058537600, 440608585497673),
138    (5137634824069440, 7184741470321),
139    (86486965741794240, 119925729055171),
140    (72765041063869440, 100052812924811),
141    (382465869225686400, 521524282669627),
142    (200947854315237120, 271750623379409),
143    (211070614375272960, 283106464392467),
144    (443229596921879040, 589677598582609),
145    (93037730707152000, 122782765275449),
146    (122011730766132480, 159735121308613),
147    (31989601573556880, 41548547094343),
148    (536578685942906880, 691442117296699),
149    (562312749128296320, 718956372878959),
150    (58906718757868800, 74733962917711),
151    (308437057346584320, 388306155099701),
152    (645766395987525120, 806795157490933),
153    (675777660747047040, 837909232583089),
154    (88367789221113600, 108746989930373),
155    (7392955471941312, 9030169269229),
156    (772873352429122560, 937054291209727),
157    (807712532156799360, 972110378274403),
158    (421925356218643200, 504103943160677),
159    (440663177449098240, 522684924118967),
160    (184035753802897920, 216723926808773),
161    (960448124477911680, 1122980953340677),
162    (250543865914003200, 290869464440287),
163    (130675339267593120, 150641842927343),
164    (1090172701386639360, 1247976353357059),
165    (227305832287712640, 258405555999851),
166    (592258376874528000, 668657233798751),
167    (617090537042622720, 691931107341209),
168    (1285568667525342720, 1431697176512509),
169    (1338727041544717440, 1480845867523609),
170    (17421308489894400, 19141689547229),
171    (362637763088018880, 395798076353863),
172    (1509316635105377280, 1636444899099463),
173    (1570052917167799680, 1691120920469899),
174    (816406208713455360, 873624358295417),
175    (169764869756505600, 180485700840031),
176    (1764616375772490240, 1863974893159777),
177    (1833771140550088320, 1924631846903533),
178    (476292441150408960, 496714431722041),
179    (15459922803247650, 16020959172203),
180    (82197247453483008, 84645504616579),
181    (2133413076727820160, 2183253266625727),
182    (1107188520108929280, 1126030567157939),
183    (1148942741022585600, 1161296509297277),
184    (2384001976885562880, 2394881115490309),
185    (494558256674401920, 493791603880013),
186    (320539919837948160, 318107090692319),
187    (664663343335992000, 655652658096937),
188    (2755861725809525760, 2702253544146319),
189    (2856014057546981760, 2783819673179059),
190    (295918126790065920, 286734364246633),
191    (1532717764584652800, 1476430244026751),
192    (3174850301752496640, 3040405661500393),
193    (3287500349386619520, 3130015032330709),
194    (850865438617608960, 805431222620371),
195    (88070298337005600, 82889298718813),
196    (3645629652474501120, 3411593345255827),
197    (3771995042688324480, 3509826645865063),
198    (1950994808108586240, 1805154923332487),
199    (2017848140895202560, 1856540688200417),
200    (834639872126860800, 763636019785577),
201    (4314584602424691840, 3925645315660777),
202    (139373100041535360, 126109899000719),
203    (1152337953034676160, 1036958659974091),
204    (4762912566489369600, 4262639560070359),
205    (196828523566915968, 175198904187667),
206    (2541423257268698880, 2249937649856801),
207    (2624703751488698880, 2311194811672739),
208    (5420492257513536000, 4747558008502129),
209    (5596198540461809280, 4875423345253309),
210    (288831284509620480, 250301449163657),
211    (372617164873633680, 321213670893097),
212    (6152047924932403200, 5275636874533723),
213    (6347249719036786560, 5414728147189519),
214    (3273792916129102080, 2778368882421467),
215    (675316373775563520, 570171141193153),
216    (6964092587176435200, 5849695247193877),
217    (7180483228042227840, 6000735906118993),
218    (925306027653047040, 769360062924473),
219    (1907525464627258560, 1578044158840621),
220    (1572712036050355200, 1294534476491219),
221    (8102940993121806720, 6636416311661827),
222    (4174181943967875840, 3401728739481269),
223    (4299975128790512640, 3486922715894087),
224    (8857823315028779520, 7147630211465209),
225    (1824421622287286400, 1464972471133217),
226    (2348232888584943360, 1876398225214663),
227    (1208802803241831840, 961234173094451),
228];
229
230#[cfg(test)]
231mod tests {
232    use super::ln2_iter;
233
234    #[test]
235    fn ln2_test() {
236        assert_eq!(
237            ln2_iter(2).to_approx_string(9),
238            "0.6931471"
239        );
240        assert_eq!(
241            ln2_iter(3).to_approx_string(12),
242            "0.6931471805"
243        );
244        assert_eq!(
245            ln2_iter(4).to_approx_string(14),
246            "0.693147180559"
247        );
248        assert_eq!(
249            ln2_iter(5).to_approx_string(16),
250            "0.69314718055994"
251        );
252        assert_eq!(
253            ln2_iter(6).to_approx_string(17),
254            "0.693147180559945"
255        );
256
257        assert_eq!(
258            std::f64::consts::LN_2,
259            ln2_iter(6).to_ieee754_f64().unwrap(),
260        );
261    }
262
263}