Swift - A new Programming Language
C++ rocket vs Swift rocket
We have a C++ rocket which calculates Fibonacci and we have a Swift rocket which calculates also Fibonacci the same way. Both programs to the same. Really? Not really. The C++ does give you wrong numbers for large numbers which the Swift version will crash. Sometimes crashing is better.
Let's assume we have a rocket. A C++ rocket and a Swift rocket.
The C++ Rocket
The C++ rocket program just runs and maybe will also pass some testing. But if the tests not include such large numbers as they may appear in the real world, the C++ Rocket will behave undefined.
With C++ the largest valid number is 1836311903. After this value C++ just continue to run and prints out garbage. So C++ was not able to detect an overflow, which is terrible.
The Swift Rocket
The Swift rocket program also can not handle large numbers, but it crashes and does not provide wrong undefined numbers. So it does not feed the rocket with wrong numbers.
The Swift rocket runs until 7540113804746346429 but then it crashes. This is a very large number. But at least Swift does not produce wrong numbers.
7540113804746346429 <-- Swift calculated Fibonacci value, #92.: OK
Let's enter not a number
Swift:
$ swift ./fibonacci.uni.swift Enter the number of terms: abc fatal error: unexpectedly found nil while unwrapping an Optional value $
C++
$ ./a.out Enter the number of terms: abc 0 1 1 $
Terrible, C++ let's "abc" string pass through the int conversion! This is really bad.
Sorry about the numbering, I know it's wrong.
Conclusion
C++ does not let you know that you do calculations with wrong numbers.
Source Code
Fibonacci in Swift
import Foundation // -- Swift: clear output buffer for print all the time. Why is that not the default? setbuf(__stdoutp, nil); // -- Swift: has no input() right now built in. This should be there in the Swift Lang // usage: // let n_str = input() // let n = n_str.toInt()! func input() -> String { var keyboard = NSFileHandle.fileHandleWithStandardInput() var inputData = keyboard.availableData var strData = NSString(data: inputData, encoding: NSUTF8StringEncoding)! return strData.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet()) } // -- Swift: get around mutual dependencies: Put code in the same line. Strange notation. doMain(); func doMain() { print("Enter the number of terms: ") let n_str = input(); let n = n_str.toInt()! println("0") println("1") println("1") var first:Int = 1 var second:Int = 1 var next:Int = 0 for var c = 1; c < n; c++ { next = first + second; first = second second = next print(c); print(":") print(next); println("") } println("") }
Output
$ swift fibonacci.uni.swift Enter the number of terms: 100 0 1 1 1:2 2:3 3:5 4:8 5:13 6:21 7:34 8:55 9:89 10:144 11:233 12:377 13:610 14:987 15:1597 16:2584 17:4181 18:6765 19:10946 20:17711 21:28657 22:46368 23:75025 24:121393 25:196418 26:317811 27:514229 28:832040 29:1346269 30:2178309 31:3524578 32:5702887 33:9227465 34:14930352 35:24157817 36:39088169 37:63245986 38:102334155 39:165580141 40:267914296 41:433494437 42:701408733 43:1134903170 44:1836311903 45:2971215073 46:4807526976 47:7778742049 48:12586269025 49:20365011074 50:32951280099 51:53316291173 52:86267571272 53:139583862445 54:225851433717 55:365435296162 56:591286729879 57:956722026041 58:1548008755920 59:2504730781961 60:4052739537881 61:6557470319842 62:10610209857723 63:17167680177565 64:27777890035288 65:44945570212853 66:72723460248141 67:117669030460994 68:190392490709135 69:308061521170129 70:498454011879264 71:806515533049393 72:1304969544928657 73:2111485077978050 74:3416454622906707 75:5527939700884757 76:8944394323791464 77:14472334024676221 78:23416728348467685 79:37889062373143906 80:61305790721611591 81:99194853094755497 82:160500643816367088 83:259695496911122585 84:420196140727489673 85:679891637638612258 86:1100087778366101931 87:1779979416004714189 88:2880067194370816120 89:4660046610375530309 90:7540113804746346429 <-- Number OK. 0 swift 0x0000000102b302b8 llvm::sys::PrintStackTrace(__sFILE*) + 40 1 swift 0x0000000102b30794 SignalHandler(int) + 452 2 libsystem_platform.dylib 0x00007fff89143f1a _sigtramp + 26 3 libsystem_platform.dylib 000000000000000000 _sigtramp + 1995161856 4 libsystem_platform.dylib 0x00000001055f10a8 _sigtramp + 2085278120 5 swift 0x0000000102940944 llvm::MCJIT::runFunction(llvm::Function*, std::__1::vector<llvm::GenericValue, std::__1::allocator<llvm::GenericValue> > const&) + 276 6 swift 0x0000000103c2f3b6 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, char const* const*) + 1174 7 swift 0x00000001026a61b9 swift::RunImmediately(swift::CompilerInstance&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, swift::IRGenOptions&, swift::SILOptions const&) + 1737 8 swift 0x0000000102419f98 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 6408 9 swift 0x00000001024184e6 main + 1814 10 libdyld.dylib 0x00007fff82bcd5c9 start + 1 11 libdyld.dylib 0x000000000000000c start + 2101553732 Stack dump: 0. Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret fibonacci.uni.swift -target x86_64-apple-darwin14.3.0 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -color-diagnostics -module-name main Illegal instruction: 4
Fibonacci in C++
#include <stdio.h> #include <math.h> #include <float.h> #include <fenv.h> #include <exception> #include <iostream> using namespace std; using std::overflow_error; int main(int argc, char *argv[]) { cout << "Enter the number of terms: "; unsigned long int n; cin >> n; cout << 0 << endl << flush;; cout << 1 << endl << flush;; cout << 1 << endl << flush;; int first = 1; int second = 1; int next = 0; for (int c=1; c<=n; c++) { next = first + second; first = second; second = next; cout << c; cout << ":"; cout << next; cout << "" << endl; } cout << "" << endl; } }
Output
$ ./fibonacci Enter the number of terms: 100 0 1 1 1:2 2:3 3:5 4:8 5:13 6:21 7:34 8:55 9:89 10:144 11:233 12:377 13:610 14:987 15:1597 16:2584 17:4181 18:6765 19:10946 20:17711 21:28657 22:46368 23:75025 24:121393 25:196418 26:317811 27:514229 28:832040 29:1346269 30:2178309 31:3524578 32:5702887 33:9227465 34:14930352 35:24157817 36:39088169 37:63245986 38:102334155 39:165580141 40:267914296 41:433494437 42:701408733 43:1134903170 44:1836311903 45:-1323752223 <-- WRONG! Minus value! 46:512559680 47:-811192543 48:-298632863 49:-1109825406 50:-1408458269 51:1776683621 52:368225352 53:2144908973 54:-1781832971 55:363076002 56:-1418756969 57:-1055680967 58:1820529360 59:764848393 60:-1709589543 61:-944741150 62:1640636603 63:695895453 64:-1958435240 65:-1262539787 66:1073992269 67:-188547518 68:885444751 69:696897233 70:1582341984 71:-2015728079 72:-433386095 73:1845853122 74:1412467027 75:-1036647147 76:375819880 77:-660827267 78:-285007387 79:-945834654 80:-1230842041 81:2118290601 82:887448560 83:-1289228135 84:-401779575 85:-1691007710 86:-2092787285 87:511172301 88:-1581614984 89:-1070442683 90:1642909629 91:572466946 92:-2079590721 93:-1507123775 94:708252800 95:-798870975 96:-90618175 97:-889489150 98:-980107325 99:-1869596475 100:1445263496
Fibonacci with OpenOffice Calc
How does OpenOffice Calc does it? It uses some extended Big Number libraries like Boost, bignum or similar.
Just enter =SUM(B1+B2) and then click and drag the Cell with the formula in it down to Cell 500 or whatever you want to copy the formula.
First 500 numbers (no warranty 😉
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
13 233
14 377
15 610
16 987
17 1597
18 2584
19 4181
20 6765
21 10946
22 17711
23 28657
24 46368
25 75025
26 121393
27 196418
28 317811
29 514229
30 832040
31 1346269
32 2178309
33 3524578
34 5702887
35 9227465
36 14930352
37 24157817
38 39088169
39 63245986
40 102334155
41 165580141
42 267914296
43 433494437
44 701408733
45 1134903170
46 1836311903
47 2971215073
48 4807526976
49 7778742049
50 12586269025
51 20365011074
52 32951280099
53 53316291173
54 86267571272
55 139583862445
56 225851433717
57 365435296162
58 591286729879
59 956722026041
60 1548008755920
61 2504730781961
62 4052739537881
63 6557470319842
64 10610209857723
65 17167680177565
66 27777890035288
67 44945570212853
68 72723460248141
69 117669030460994
70 190392490709135
71 308061521170129
72 498454011879264
73 806515533049393
74 1304969544928660
75 2111485077978050
76 3416454622906710
77 5527939700884760
78 8944394323791460
79 14472334024676200
80 23416728348467700
81 37889062373143900
82 61305790721611600
83 99194853094755500
84 160500643816367000
85 259695496911123000
86 420196140727490000
87 679891637638612000
88 1100087778366100000
89 1779979416004710000
90 2880067194370820000
91 4660046610375530000
92 7540113804746350000 <-- WRONG Numbers here and below, IEEE numbers?
93 12200160415121900000
94 19740274219868200000
95 31940434634990100000
96 51680708854858300000
97 83621143489848400000
98 135301852344707000000
99 218922995834555000000
100 354224848179262000000
101 573147844013817000000
102 927372692193079000000
103 1500520536206900000000
104 2427893228399980000000
105 3928413764606870000000
106 6356306993006850000000
107 10284720757613700000000
108 16641027750620600000000
109 26925748508234300000000
110 43566776258854900000000
111 70492524767089100000000
112 114059301025944000000000
113 184551825793033000000000
114 298611126818977000000000
115 483162952612010000000000
116 781774079430988000000000
117 1264937032043000000000000
118 2046711111473990000000000
119 3311648143516980000000000
120 5358359254990970000000000
121 8670007398507950000000000
122 14028366653498900000000000
123 22698374052006900000000000
124 36726740705505800000000000
125 59425114757512700000000000
126 96151855463018400000000000
127 155576970220531000000000000
128 251728825683550000000000000
129 407305795904081000000000000
130 659034621587630000000000000
131 1066340417491710000000000000
132 1725375039079340000000000000
133 2791715456571050000000000000
134 4517090495650390000000000000
135 7308805952221450000000000000
136 11825896447871800000000000000
137 19134702400093300000000000000
138 30960598847965100000000000000
139 50095301248058400000000000000
140 81055900096023500000000000000
141 131151201344082000000000000000
142 212207101440105000000000000000
143 343358302784187000000000000000
144 555565404224293000000000000000
145 898923707008480000000000000000
146 1454489111232770000000000000000
147 2353412818241250000000000000000
148 3807901929474030000000000000000
149 6161314747715280000000000000000
150 9969216677189310000000000000000
151 16130531424904600000000000000000
152 26099748102093900000000000000000
153 42230279526998500000000000000000
154 68330027629092400000000000000000
155 110560307156091000000000000000000
156 178890334785183000000000000000000
157 289450641941274000000000000000000
158 468340976726457000000000000000000
159 757791618667731000000000000000000
160 1226132595394190000000000000000000
161 1983924214061920000000000000000000
162 3210056809456110000000000000000000
163 5193981023518030000000000000000000
164 8404037832974140000000000000000000
165 13598018856492200000000000000000000
166 22002056689466300000000000000000000
167 35600075545958500000000000000000000
168 57602132235424800000000000000000000
169 93202207781383200000000000000000000
170 150804340016808000000000000000000000
171 244006547798191000000000000000000000
172 394810887814999000000000000000000000
173 638817435613191000000000000000000000
174 1033628323428190000000000000000000000
175 1672445759041380000000000000000000000
176 2706074082469570000000000000000000000
177 4378519841510950000000000000000000000
178 7084593923980520000000000000000000000
179 11463113765491500000000000000000000000
180 18547707689472000000000000000000000000
181 30010821454963500000000000000000000000
182 48558529144435400000000000000000000000
183 78569350599398900000000000000000000000
184 127127879743834000000000000000000000000
185 205697230343233000000000000000000000000
186 332825110087068000000000000000000000000
187 538522340430301000000000000000000000000
188 871347450517368000000000000000000000000
189 1409869790947670000000000000000000000000
190 2281217241465040000000000000000000000000
191 3691087032412710000000000000000000000000
192 5972304273877750000000000000000000000000
193 9663391306290450000000000000000000000000
194 15635695580168200000000000000000000000000
195 25299086886458600000000000000000000000000
196 40934782466626800000000000000000000000000
197 66233869353085500000000000000000000000000
198 107168651819712000000000000000000000000000
199 173402521172798000000000000000000000000000
200 280571172992510000000000000000000000000000
201 453973694165308000000000000000000000000000
202 734544867157818000000000000000000000000000
203 1188518561323130000000000000000000000000000
204 1923063428480940000000000000000000000000000
205 3111581989804070000000000000000000000000000
206 5034645418285010000000000000000000000000000
207 8146227408089080000000000000000000000000000
208 13180872826374100000000000000000000000000000
209 21327100234463200000000000000000000000000000
210 34507973060837300000000000000000000000000000
211 55835073295300500000000000000000000000000000
212 90343046356137800000000000000000000000000000
213 146178119651438000000000000000000000000000000
214 236521166007576000000000000000000000000000000
215 382699285659014000000000000000000000000000000
216 619220451666590000000000000000000000000000000
217 1001919737325600000000000000000000000000000000
218 1621140188992190000000000000000000000000000000
219 2623059926317800000000000000000000000000000000
220 4244200115309990000000000000000000000000000000
221 6867260041627790000000000000000000000000000000
222 11111460156937800000000000000000000000000000000
223 17978720198565600000000000000000000000000000000
224 29090180355503400000000000000000000000000000000
225 47068900554068900000000000000000000000000000000
226 76159080909572300000000000000000000000000000000
227 123227981463641000000000000000000000000000000000
228 199387062373214000000000000000000000000000000000
229 322615043836855000000000000000000000000000000000
230 522002106210068000000000000000000000000000000000
231 844617150046923000000000000000000000000000000000
232 1366619256256990000000000000000000000000000000000
233 2211236406303910000000000000000000000000000000000
234 3577855662560910000000000000000000000000000000000
235 5789092068864820000000000000000000000000000000000
236 9366947731425720000000000000000000000000000000000
237 15156039800290500000000000000000000000000000000000
238 24522987531716300000000000000000000000000000000000
239 39679027332006800000000000000000000000000000000000
240 64202014863723100000000000000000000000000000000000
241 103881042195730000000000000000000000000000000000000
242 168083057059453000000000000000000000000000000000000
243 271964099255183000000000000000000000000000000000000
244 440047156314636000000000000000000000000000000000000
245 712011255569819000000000000000000000000000000000000
246 1152058411884450000000000000000000000000000000000000
247 1864069667454270000000000000000000000000000000000000
248 3016128079338730000000000000000000000000000000000000
249 4880197746793000000000000000000000000000000000000000
250 7896325826131730000000000000000000000000000000000000
251 12776523572924700000000000000000000000000000000000000
252 20672849399056500000000000000000000000000000000000000
253 33449372971981200000000000000000000000000000000000000
254 54122222371037600000000000000000000000000000000000000
255 87571595343018800000000000000000000000000000000000000
256 141693817714056000000000000000000000000000000000000000
257 229265413057075000000000000000000000000000000000000000
258 370959230771132000000000000000000000000000000000000000
259 600224643828207000000000000000000000000000000000000000
260 971183874599339000000000000000000000000000000000000000
261 1571408518427550000000000000000000000000000000000000000
262 2542592393026880000000000000000000000000000000000000000
263 4114000911454430000000000000000000000000000000000000000
264 6656593304481320000000000000000000000000000000000000000
265 10770594215935700000000000000000000000000000000000000000
266 17427187520417100000000000000000000000000000000000000000
267 28197781736352800000000000000000000000000000000000000000
268 45624969256769900000000000000000000000000000000000000000
269 73822750993122700000000000000000000000000000000000000000
270 119447720249893000000000000000000000000000000000000000000
271 193270471243015000000000000000000000000000000000000000000
272 312718191492908000000000000000000000000000000000000000000
273 505988662735923000000000000000000000000000000000000000000
274 818706854228831000000000000000000000000000000000000000000
275 1324695516964750000000000000000000000000000000000000000000
276 2143402371193580000000000000000000000000000000000000000000
277 3468097888158340000000000000000000000000000000000000000000
278 5611500259351920000000000000000000000000000000000000000000
279 9079598147510260000000000000000000000000000000000000000000
280 14691098406862200000000000000000000000000000000000000000000
281 23770696554372400000000000000000000000000000000000000000000
282 38461794961234600000000000000000000000000000000000000000000
283 62232491515607100000000000000000000000000000000000000000000
284 100694286476842000000000000000000000000000000000000000000000
285 162926777992449000000000000000000000000000000000000000000000
286 263621064469290000000000000000000000000000000000000000000000
287 426547842461739000000000000000000000000000000000000000000000
288 690168906931030000000000000000000000000000000000000000000000
289 1116716749392770000000000000000000000000000000000000000000000
290 1806885656323800000000000000000000000000000000000000000000000
291 2923602405716570000000000000000000000000000000000000000000000
292 4730488062040370000000000000000000000000000000000000000000000
293 7654090467756930000000000000000000000000000000000000000000000
294 12384578529797300000000000000000000000000000000000000000000000
295 20038668997554200000000000000000000000000000000000000000000000
296 32423247527351500000000000000000000000000000000000000000000000
297 52461916524905800000000000000000000000000000000000000000000000
298 84885164052257300000000000000000000000000000000000000000000000
299 137347080577163000000000000000000000000000000000000000000000000
300 222232244629420000000000000000000000000000000000000000000000000
301 359579325206583000000000000000000000000000000000000000000000000
302 581811569836004000000000000000000000000000000000000000000000000
303 941390895042587000000000000000000000000000000000000000000000000
304 1523202464878590000000000000000000000000000000000000000000000000
305 2464593359921180000000000000000000000000000000000000000000000000
306 3987795824799770000000000000000000000000000000000000000000000000
307 6452389184720950000000000000000000000000000000000000000000000000
308 10440185009520700000000000000000000000000000000000000000000000000
309 16892574194241700000000000000000000000000000000000000000000000000
310 27332759203762400000000000000000000000000000000000000000000000000
311 44225333398004000000000000000000000000000000000000000000000000000
312 71558092601766400000000000000000000000000000000000000000000000000
313 115783425999770000000000000000000000000000000000000000000000000000
314 187341518601537000000000000000000000000000000000000000000000000000
315 303124944601307000000000000000000000000000000000000000000000000000
316 490466463202844000000000000000000000000000000000000000000000000000
317 793591407804151000000000000000000000000000000000000000000000000000
318 1284057871007000000000000000000000000000000000000000000000000000000
319 2077649278811150000000000000000000000000000000000000000000000000000
320 3361707149818140000000000000000000000000000000000000000000000000000
321 5439356428629290000000000000000000000000000000000000000000000000000
322 8801063578447430000000000000000000000000000000000000000000000000000
323 14240420007076700000000000000000000000000000000000000000000000000000
324 23041483585524200000000000000000000000000000000000000000000000000000
325 37281903592600900000000000000000000000000000000000000000000000000000
326 60323387178125000000000000000000000000000000000000000000000000000000
327 97605290770725900000000000000000000000000000000000000000000000000000
328 157928677948851000000000000000000000000000000000000000000000000000000
329 255533968719577000000000000000000000000000000000000000000000000000000
330 413462646668428000000000000000000000000000000000000000000000000000000
331 668996615388005000000000000000000000000000000000000000000000000000000
332 1082459262056430000000000000000000000000000000000000000000000000000000
333 1751455877444440000000000000000000000000000000000000000000000000000000
334 2833915139500870000000000000000000000000000000000000000000000000000000
335 4585371016945310000000000000000000000000000000000000000000000000000000
336 7419286156446170000000000000000000000000000000000000000000000000000000
337 12004657173391500000000000000000000000000000000000000000000000000000000
338 19423943329837700000000000000000000000000000000000000000000000000000000
339 31428600503229100000000000000000000000000000000000000000000000000000000
340 50852543833066800000000000000000000000000000000000000000000000000000000
341 82281144336295900000000000000000000000000000000000000000000000000000000
342 133133688169363000000000000000000000000000000000000000000000000000000000
343 215414832505659000000000000000000000000000000000000000000000000000000000
344 348548520675021000000000000000000000000000000000000000000000000000000000
345 563963353180680000000000000000000000000000000000000000000000000000000000
346 912511873855701000000000000000000000000000000000000000000000000000000000
347 1476475227036380000000000000000000000000000000000000000000000000000000000
348 2388987100892080000000000000000000000000000000000000000000000000000000000
349 3865462327928460000000000000000000000000000000000000000000000000000000000
350 6254449428820550000000000000000000000000000000000000000000000000000000000
351 10119911756749000000000000000000000000000000000000000000000000000000000000
352 16374361185569600000000000000000000000000000000000000000000000000000000000
353 26494272942318600000000000000000000000000000000000000000000000000000000000
354 42868634127888100000000000000000000000000000000000000000000000000000000000
355 69362907070206700000000000000000000000000000000000000000000000000000000000
356 112231541198095000000000000000000000000000000000000000000000000000000000000
357 181594448268302000000000000000000000000000000000000000000000000000000000000
358 293825989466396000000000000000000000000000000000000000000000000000000000000
359 475420437734698000000000000000000000000000000000000000000000000000000000000
360 769246427201094000000000000000000000000000000000000000000000000000000000000
361 1244666864935790000000000000000000000000000000000000000000000000000000000000
362 2013913292136890000000000000000000000000000000000000000000000000000000000000
363 3258580157072680000000000000000000000000000000000000000000000000000000000000
364 5272493449209560000000000000000000000000000000000000000000000000000000000000
365 8531073606282240000000000000000000000000000000000000000000000000000000000000
366 13803567055491800000000000000000000000000000000000000000000000000000000000000
367 22334640661774000000000000000000000000000000000000000000000000000000000000000
368 36138207717265800000000000000000000000000000000000000000000000000000000000000
369 58472848379039900000000000000000000000000000000000000000000000000000000000000
370 94611056096305700000000000000000000000000000000000000000000000000000000000000
371 153083904475346000000000000000000000000000000000000000000000000000000000000000
372 247694960571651000000000000000000000000000000000000000000000000000000000000000
373 400778865046997000000000000000000000000000000000000000000000000000000000000000
374 648473825618648000000000000000000000000000000000000000000000000000000000000000
375 1049252690665650000000000000000000000000000000000000000000000000000000000000000
376 1697726516284290000000000000000000000000000000000000000000000000000000000000000
377 2746979206949940000000000000000000000000000000000000000000000000000000000000000
378 4444705723234230000000000000000000000000000000000000000000000000000000000000000
379 7191684930184170000000000000000000000000000000000000000000000000000000000000000
380 11636390653418400000000000000000000000000000000000000000000000000000000000000000
381 18828075583602600000000000000000000000000000000000000000000000000000000000000000
382 30464466237021000000000000000000000000000000000000000000000000000000000000000000
383 49292541820623600000000000000000000000000000000000000000000000000000000000000000
384 79757008057644600000000000000000000000000000000000000000000000000000000000000000
385 129049549878268000000000000000000000000000000000000000000000000000000000000000000
386 208806557935913000000000000000000000000000000000000000000000000000000000000000000
387 337856107814181000000000000000000000000000000000000000000000000000000000000000000
388 546662665750093000000000000000000000000000000000000000000000000000000000000000000
389 884518773564274000000000000000000000000000000000000000000000000000000000000000000
390 1431181439314370000000000000000000000000000000000000000000000000000000000000000000
391 2315700212878640000000000000000000000000000000000000000000000000000000000000000000
392 3746881652193010000000000000000000000000000000000000000000000000000000000000000000
393 6062581865071650000000000000000000000000000000000000000000000000000000000000000000
394 9809463517264660000000000000000000000000000000000000000000000000000000000000000000
395 15872045382336300000000000000000000000000000000000000000000000000000000000000000000
396 25681508899601000000000000000000000000000000000000000000000000000000000000000000000
397 41553554281937300000000000000000000000000000000000000000000000000000000000000000000
398 67235063181538300000000000000000000000000000000000000000000000000000000000000000000
399 108788617463476000000000000000000000000000000000000000000000000000000000000000000000
400 176023680645014000000000000000000000000000000000000000000000000000000000000000000000
401 284812298108489000000000000000000000000000000000000000000000000000000000000000000000
402 460835978753503000000000000000000000000000000000000000000000000000000000000000000000
403 745648276861992000000000000000000000000000000000000000000000000000000000000000000000
404 1206484255615500000000000000000000000000000000000000000000000000000000000000000000000
405 1952132532477490000000000000000000000000000000000000000000000000000000000000000000000
406 3158616788092980000000000000000000000000000000000000000000000000000000000000000000000
407 5110749320570470000000000000000000000000000000000000000000000000000000000000000000000
408 8269366108663460000000000000000000000000000000000000000000000000000000000000000000000
409 13380115429233900000000000000000000000000000000000000000000000000000000000000000000000
410 21649481537897400000000000000000000000000000000000000000000000000000000000000000000000
411 35029596967131300000000000000000000000000000000000000000000000000000000000000000000000
412 56679078505028700000000000000000000000000000000000000000000000000000000000000000000000
413 91708675472160000000000000000000000000000000000000000000000000000000000000000000000000
414 148387753977189000000000000000000000000000000000000000000000000000000000000000000000000
415 240096429449349000000000000000000000000000000000000000000000000000000000000000000000000
416 388484183426537000000000000000000000000000000000000000000000000000000000000000000000000
417 628580612875886000000000000000000000000000000000000000000000000000000000000000000000000
418 1017064796302420000000000000000000000000000000000000000000000000000000000000000000000000
419 1645645409178310000000000000000000000000000000000000000000000000000000000000000000000000
420 2662710205480730000000000000000000000000000000000000000000000000000000000000000000000000
421 4308355614659040000000000000000000000000000000000000000000000000000000000000000000000000
422 6971065820139780000000000000000000000000000000000000000000000000000000000000000000000000
423 11279421434798800000000000000000000000000000000000000000000000000000000000000000000000000
424 18250487254938600000000000000000000000000000000000000000000000000000000000000000000000000
425 29529908689737400000000000000000000000000000000000000000000000000000000000000000000000000
426 47780395944676000000000000000000000000000000000000000000000000000000000000000000000000000
427 77310304634413400000000000000000000000000000000000000000000000000000000000000000000000000
428 125090700579089000000000000000000000000000000000000000000000000000000000000000000000000000
429 202401005213503000000000000000000000000000000000000000000000000000000000000000000000000000
430 327491705792592000000000000000000000000000000000000000000000000000000000000000000000000000
431 529892711006095000000000000000000000000000000000000000000000000000000000000000000000000000
432 857384416798687000000000000000000000000000000000000000000000000000000000000000000000000000
433 1387277127804780000000000000000000000000000000000000000000000000000000000000000000000000000
434 2244661544603470000000000000000000000000000000000000000000000000000000000000000000000000000
435 3631938672408250000000000000000000000000000000000000000000000000000000000000000000000000000
436 5876600217011720000000000000000000000000000000000000000000000000000000000000000000000000000
437 9508538889419980000000000000000000000000000000000000000000000000000000000000000000000000000
438 15385139106431700000000000000000000000000000000000000000000000000000000000000000000000000000
439 24893677995851700000000000000000000000000000000000000000000000000000000000000000000000000000
440 40278817102283400000000000000000000000000000000000000000000000000000000000000000000000000000
441 65172495098135000000000000000000000000000000000000000000000000000000000000000000000000000000
442 105451312200418000000000000000000000000000000000000000000000000000000000000000000000000000000
443 170623807298553000000000000000000000000000000000000000000000000000000000000000000000000000000
444 276075119498972000000000000000000000000000000000000000000000000000000000000000000000000000000
445 446698926797525000000000000000000000000000000000000000000000000000000000000000000000000000000
446 722774046296497000000000000000000000000000000000000000000000000000000000000000000000000000000
447 1169472973094020000000000000000000000000000000000000000000000000000000000000000000000000000000
448 1892247019390520000000000000000000000000000000000000000000000000000000000000000000000000000000
449 3061719992484540000000000000000000000000000000000000000000000000000000000000000000000000000000
450 4953967011875060000000000000000000000000000000000000000000000000000000000000000000000000000000
451 8015687004359600000000000000000000000000000000000000000000000000000000000000000000000000000000
452 12969654016234700000000000000000000000000000000000000000000000000000000000000000000000000000000
453 20985341020594300000000000000000000000000000000000000000000000000000000000000000000000000000000
454 33954995036828900000000000000000000000000000000000000000000000000000000000000000000000000000000
455 54940336057423200000000000000000000000000000000000000000000000000000000000000000000000000000000
456 88895331094252100000000000000000000000000000000000000000000000000000000000000000000000000000000
457 143835667151675000000000000000000000000000000000000000000000000000000000000000000000000000000000
458 232730998245927000000000000000000000000000000000000000000000000000000000000000000000000000000000
459 376566665397603000000000000000000000000000000000000000000000000000000000000000000000000000000000
460 609297663643530000000000000000000000000000000000000000000000000000000000000000000000000000000000
461 985864329041133000000000000000000000000000000000000000000000000000000000000000000000000000000000
462 1595161992684660000000000000000000000000000000000000000000000000000000000000000000000000000000000
463 2581026321725800000000000000000000000000000000000000000000000000000000000000000000000000000000000
464 4176188314410460000000000000000000000000000000000000000000000000000000000000000000000000000000000
465 6757214636136250000000000000000000000000000000000000000000000000000000000000000000000000000000000
466 10933402950546700000000000000000000000000000000000000000000000000000000000000000000000000000000000
467 17690617586683000000000000000000000000000000000000000000000000000000000000000000000000000000000000
468 28624020537229700000000000000000000000000000000000000000000000000000000000000000000000000000000000
469 46314638123912600000000000000000000000000000000000000000000000000000000000000000000000000000000000
470 74938658661142300000000000000000000000000000000000000000000000000000000000000000000000000000000000
471 121253296785055000000000000000000000000000000000000000000000000000000000000000000000000000000000000
472 196191955446197000000000000000000000000000000000000000000000000000000000000000000000000000000000000
473 317445252231252000000000000000000000000000000000000000000000000000000000000000000000000000000000000
474 513637207677450000000000000000000000000000000000000000000000000000000000000000000000000000000000000
475 831082459908702000000000000000000000000000000000000000000000000000000000000000000000000000000000000
476 1344719667586150000000000000000000000000000000000000000000000000000000000000000000000000000000000000
477 2175802127494850000000000000000000000000000000000000000000000000000000000000000000000000000000000000
478 3520521795081000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
479 5696323922575860000000000000000000000000000000000000000000000000000000000000000000000000000000000000
480 9216845717656860000000000000000000000000000000000000000000000000000000000000000000000000000000000000
481 14913169640232700000000000000000000000000000000000000000000000000000000000000000000000000000000000000
482 24130015357889600000000000000000000000000000000000000000000000000000000000000000000000000000000000000
483 39043184998122300000000000000000000000000000000000000000000000000000000000000000000000000000000000000
484 63173200356011900000000000000000000000000000000000000000000000000000000000000000000000000000000000000
485 102216385354134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
486 165389585710146000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
487 267605971064280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
488 432995556774426000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
489 700601527838707000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
490 1133597084613130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
491 1834198612451840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
492 2967795697064970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
493 4801994309516810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
494 7769790006581780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
495 12571784316098600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
496 20341574322680400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
497 32913358638779000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
498 53254932961459400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
499 86168291600238300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
500 139423224561698000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000