Rev 15 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | daniel-mar | 1 | package de.viathinksoft.immortable.genX; |
2 | |||
3 | // TODO: Immort Test + Backups regelmäßig durchführen |
||
4 | |||
5 | import java.io.BufferedReader; |
||
6 | import java.io.BufferedWriter; |
||
7 | import java.io.File; |
||
8 | import java.io.FileReader; |
||
9 | import java.io.FileWriter; |
||
10 | import java.io.IOException; |
||
11 | import java.util.Vector; |
||
12 | |||
13 | public class ImmortIterator { |
||
14 | |||
15 | /* |
||
16 | * public static boolean isImmortable(BigInteger num) { |
||
17 | // Alternativ: n²%10^m == n%10^m |
||
18 | return num.pow(2).toString().endsWith(num.toString()); |
||
19 | } |
||
20 | |||
21 | */ |
||
22 | |||
23 | // TODO: Output M5/M6 function... |
||
24 | // TODO: r als BigInteger? |
||
25 | |||
26 | private static final String SIGNATURE = "Immortable Interator GenX int DSO 1000"; |
||
27 | private static final int SOFTBREAK = 76; |
||
28 | |||
29 | private Vector<Integer> a = new Vector<Integer>(); |
||
30 | private int u; |
||
31 | private int r; |
||
32 | private int saveInterval = 100000; // TODO: Größer |
||
33 | private String filename; |
||
34 | |||
35 | // TODO: load+save prüfen |
||
36 | |||
37 | public ImmortIterator(String filename) throws Exception { |
||
38 | this.filename = filename; |
||
39 | load(); |
||
40 | } |
||
41 | |||
42 | public int getSaveInterval() { |
||
43 | return this.saveInterval; |
||
44 | } |
||
45 | |||
46 | public void setSaveInterval(int saveInterval) { |
||
47 | this.saveInterval = saveInterval; |
||
48 | } |
||
49 | |||
50 | private boolean savePointExists() { |
||
51 | return new File(filename).exists(); |
||
52 | } |
||
53 | |||
54 | private void load() throws Exception { |
||
55 | if (!savePointExists()) |
||
56 | return; |
||
57 | |||
58 | BufferedReader f = new BufferedReader(new FileReader(filename)); |
||
59 | |||
60 | String s = f.readLine(); |
||
61 | if (!s.equals(SIGNATURE)) { |
||
62 | throw new Exception("Wrong signature"); |
||
63 | } |
||
64 | |||
65 | f.readLine(); // "" |
||
66 | f.readLine(); // "(u)" |
||
67 | |||
68 | s = f.readLine(); |
||
69 | u = Integer.parseInt(s); |
||
70 | |||
71 | f.readLine(); // "" |
||
72 | f.readLine(); // "(r)" |
||
73 | |||
74 | s = f.readLine(); |
||
75 | r = Integer.parseInt(s); // TODO: more than 1 line |
||
76 | |||
77 | f.readLine(); // "" |
||
78 | f.readLine(); // "(M5rev)" |
||
79 | |||
80 | a.clear(); |
||
81 | do { |
||
82 | s = f.readLine(); |
||
83 | if (s == null) break; // eof |
||
84 | for (int i=0; i<s.length(); i++) { |
||
85 | a.add(new Integer(s.substring(i, i+1))); |
||
86 | } |
||
87 | } while (!s.equals("")); |
||
88 | |||
89 | f.close(); |
||
90 | } |
||
91 | |||
92 | private void save() throws IOException { |
||
93 | BufferedWriter f = new BufferedWriter(new FileWriter(filename)); |
||
94 | |||
95 | f.write(SIGNATURE + "\r\n"); |
||
96 | f.write("\r\n"); |
||
97 | |||
98 | f.write("(u)\r\n"); |
||
99 | f.write(u + "\r\n"); |
||
100 | f.write("\r\n"); |
||
101 | |||
102 | f.write("(r)\r\n"); |
||
103 | f.write(r + "\r\n"); // TODO: Softbreak |
||
104 | f.write("\r\n"); |
||
105 | |||
106 | f.write("(M5rev)\r\n"); |
||
107 | |||
108 | int i = 0; |
||
109 | for (Integer xa : a) { |
||
110 | f.write(xa.toString()); |
||
111 | if (++i % SOFTBREAK == 0) { |
||
112 | f.write("\r\n"); |
||
113 | } |
||
114 | } |
||
115 | |||
116 | if (++i % SOFTBREAK != 0) { |
||
117 | f.write("\r\n"); |
||
118 | } |
||
119 | |||
120 | f.close(); |
||
121 | } |
||
122 | |||
123 | public void calcIterate(int amount) throws IOException { |
||
124 | int s, m, k; |
||
125 | int cnt = 0; |
||
126 | |||
127 | if (a.size() < 2) { |
||
128 | a.add(5); |
||
129 | a.add(2); |
||
130 | u = 1; |
||
131 | r = 2; |
||
132 | cnt += 2; |
||
133 | } |
||
134 | |||
135 | while (true) { |
||
136 | r = (r - a.elementAt(u)) / 10 + a.elementAt(u); |
||
137 | s = 0; |
||
138 | for (m = 1, k = u; m < k; m++, k--) { |
||
139 | s += a.elementAt(m) * a.elementAt(k); |
||
140 | } |
||
141 | r += 2 * s; |
||
142 | if (m == k) { |
||
143 | r += a.elementAt(m) * a.elementAt(m); |
||
144 | } |
||
145 | u++; |
||
146 | a.add(r % 10); |
||
147 | |||
148 | if (cnt % saveInterval == 0) { |
||
149 | save(); |
||
150 | } |
||
151 | |||
152 | if (++cnt == amount) { |
||
153 | save(); |
||
154 | break; |
||
155 | } |
||
156 | } |
||
157 | } |
||
158 | |||
159 | } |