Subversion Repositories distributed

Rev

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
}