Subversion Repositories distributed

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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. }
  160.