From 7cb0fdb435a08c4aa90f771b1c6e98ef754f0496 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Tue, 31 Mar 2009 17:56:23 +0000 Subject: [PATCH] Bug fix and some other things --- src/zutil/MultiPrintStream.java | 77 ++++++++++++------------ src/zutil/algo/ShanksTonelliAlgo.java | 87 +++++++++++++++++++++++++++ src/zutil/algo/WienersAlgo.java | 1 + src/zutil/network/nio/NioNetwork.java | 1 + 4 files changed, 129 insertions(+), 37 deletions(-) create mode 100644 src/zutil/algo/ShanksTonelliAlgo.java diff --git a/src/zutil/MultiPrintStream.java b/src/zutil/MultiPrintStream.java index c91bf74..c9d9d3f 100644 --- a/src/zutil/MultiPrintStream.java +++ b/src/zutil/MultiPrintStream.java @@ -35,8 +35,8 @@ public class MultiPrintStream extends PrintStream { } /** - * this constructor makes a simple PrintStream that prints to the console and to a file - * @param file the file name to output to + * This constructor makes a simple PrintStream that prints to the console and to a file + * @param file is the file name to output to */ public MultiPrintStream(String file){ super(new PrintStream(System.out)); @@ -51,8 +51,8 @@ public class MultiPrintStream extends PrintStream { } /** - * this constructor takes a array of PrintStreams to be used - * @param streams a array of the streams that will be used + * This constructor takes a array of PrintStreams to be used + * @param streams is a array of the streams that will be used */ public MultiPrintStream(PrintStream[] streams){ super(streams[0]); @@ -63,39 +63,39 @@ public class MultiPrintStream extends PrintStream { } /** - * this constructor takes a array of PrintStreams to be used - * @param streams a array of the streams that will be used + * This constructor takes a array of PrintStreams to be used + * @param streams is a array of the streams that will be used */ public static void makeInstance(MultiPrintStream instanceStream){ out = instanceStream; } /** - * Adds a printstream to the list pf streams - * @param p The Printstream to add + * Adds a PrintStream to the list of streams + * @param p is the PrintStream to add */ public void addPrintStream(PrintStream p){ streams.add(p); } /** - * Remove a printstream from the list - * @param p The PrintStream to remove + * Remove a PrintStream from the list + * @param p is the PrintStream to remove */ public void removePrintStream(PrintStream p){ streams.remove(p); } /** - * Remove a printstream from the list - * @param p The index of the PrintStream to remove + * Remove a PrintStream from the list + * @param p is the index of the PrintStream to remove */ public void removePrintStream(int p){ streams.remove(p); } /** - * prints whit a new line to all the PrintStreams + * Prints with a new line to all the PrintStreams */ public void println(String s){ if(!s.equals(""))s = getTime() + s; @@ -104,7 +104,7 @@ public class MultiPrintStream extends PrintStream { } /** - * prints to all the PrintStreams + * Prints to all the PrintStreams */ public void print(String s){ for(int i=0; i- Array content + *
- Map content (HashMap etc.) + *
- List content (ArrayList, LinkedList etc.) + *
- InputStream content (Prints out until the end of the stream) + *
- Reader content (Prints out until the end of the reader) + *
- Instance variables of a Object * - * @param o The Object to dump - * @return A String with all the printed data + * @param o is the Object to dump */ - public String dump( Object o ){ - return dump( o , true); + public void dump( Object o ){ + dumpToString( o ); } /** @@ -196,12 +195,12 @@ public class MultiPrintStream extends PrintStream { *
- Reader content (Prints out until the end of the reader) *
- Instance variables of a Object * - * @param o The Object to dump - * @param print If the method should print the data or just return it + * @param o is the Object to dump + * @param print is if the method should print the data or just return it * @return A String with all the printed data */ @SuppressWarnings("unchecked") - private String dump( Object o , boolean print) { + public String dumpToString( Object o ) { if(o == null) return "NULL"; StringBuffer buffer = new StringBuffer(); Class oClass = o.getClass(); @@ -213,7 +212,7 @@ public class MultiPrintStream extends PrintStream { if ( i > 0 ) buffer.append( ", " ); Object value = Array.get(o,i); - buffer.append( (dumbCapable(value) ? dump(value,false) : value) ); + buffer.append( (dumbCapable(value) ? dumpToString(value) : value) ); } buffer.append( "]" ); } @@ -223,7 +222,7 @@ public class MultiPrintStream extends PrintStream { buffer.append( "{" ); while(it.hasNext()){ Object value = it.next(); - buffer.append( (dumbCapable(value) ? dump(value,false) : value) ); + buffer.append( (dumbCapable(value) ? dumpToString(value) : value) ); if(it.hasNext()) buffer.append( ", " ); } @@ -238,7 +237,7 @@ public class MultiPrintStream extends PrintStream { Object value = ((Map)o).get(key); buffer.append( key ); buffer.append( "=>" ); - buffer.append( (dumbCapable(value) ? dump(value,false) : value) ); + buffer.append( (dumbCapable(value) ? dumpToString(value) : value) ); if(it.hasNext()) buffer.append( ", " ); } @@ -288,7 +287,7 @@ public class MultiPrintStream extends PrintStream { try { Object value = fields[i].get(o); if (value != null) { - buffer.append( (dumbCapable(value) ? dump(value,false) : value) ); + buffer.append( (dumbCapable(value) ? dumpToString(value) : value) ); } } catch ( IllegalAccessException e ) {} } @@ -297,14 +296,18 @@ public class MultiPrintStream extends PrintStream { buffer.append( "}" ); } - if(print) out.println(buffer.toString()); return buffer.toString(); } + /** + * An helper function for the dump function. + */ private boolean dumbCapable(Object o){ - if(o.getClass().isArray()) return true; - else if(o instanceof Collection)return true; - else if(o instanceof Map)return true; + if(o != null){ + if(o.getClass().isArray()) return true; + else if(o instanceof Collection)return true; + else if(o instanceof Map)return true; + } return false; } } diff --git a/src/zutil/algo/ShanksTonelliAlgo.java b/src/zutil/algo/ShanksTonelliAlgo.java new file mode 100644 index 0000000..8f8aa7e --- /dev/null +++ b/src/zutil/algo/ShanksTonelliAlgo.java @@ -0,0 +1,87 @@ +/** + * + */ +package zutil.algo; + +import java.math.BigInteger; + +/** + * The algorithm solves the discreet log equation x^2 = n mod p + * + * @author Ziver + * @see http://en.wikipedia.org/wiki/Shanks-Tonelli_algorithm + */ +public class ShanksTonelliAlgo { + public static BigInteger calc(BigInteger n, BigInteger p){ + + BigInteger nOrg = n; + BigInteger S = null, V, R, U, X; + BigInteger ONE = BigInteger.ONE; + BigInteger TWO = BigInteger.valueOf( 2 ); + BigInteger Q = p.add( ONE ).divide( TWO ); + + switch( p.mod( BigInteger.valueOf(4) ).intValue() ){ + case 3: + S = n.pow( Q.divide( TWO ).intValue() ).mod( p ); + break; + case 1: + S = ONE; + n = n.subtract( ONE ); + while (n.divide( p ).compareTo( ONE ) == 0) { + S = S.add( ONE ); + //n = (n-2s+1) mod p + n = n.subtract( TWO.multiply( S ) ).add( ONE ).mod( p ); + if (n.compareTo( BigInteger.ZERO ) == 0){ + return S; + } + } + Q = Q.divide( TWO ); + V = ONE; + R = S; + U = ONE; + while (Q.compareTo( BigInteger.ZERO ) > 0) { + X = R.pow(2).subtract( n.multiply( U.pow(2) ) ).mod( p ); + U = TWO.multiply( R ).multiply( U ).mod( p ); + R = X; + if ( Q.testBit(0) ){ + X = S.multiply( R ).subtract( n.multiply(V).multiply(U) ).mod( p ); + V = V.multiply(R).add( S.multiply(U) ).mod( p ); + S = X; + } + Q = Q.divide( TWO ); + } + } + + if( S != null && S.multiply( S ).mod( p ).compareTo( nOrg ) != 0 ){ + return null; + } + + return S; + /* + + //p-1 = Q*2^S + BigInteger S = null, Q = null, R = null, V = null, W = null; + + //Q = ( 2^S )/( 1-p ); + p-1 = ( 2^S )/( 1-p ) * 2^S; + + // R = n^( (Q+1)/2 ) mod p + R = n.pow( Q.add(BigInteger.ONE).divide(BigInteger.valueOf(2)).intValue() ).mod( p ); + // V = W^Q mod p + V = W.pow( Q.intValue() ).mod( p ); + + for(int i=S.intValue(); true ;){ + while( true ){ + i--; + // 1 = ( ( R^2 * n^-1 )^2^i ) mod p + if( ( R.pow(2).multiply( n.pow(-1) ) ).pow( (int)Math.pow(2, i) ).mod( p ).compareTo( BigInteger.ONE ) == 0 ) + break; + } + + if(i == 0) return R; + //R = ( RV^(2^(S-i-1)) ) mod p + else R = ( R.multiply( V.pow( (int)Math.pow( 2, S.intValue()-i-1) ) )).mod( p ); + } + */ + } +} diff --git a/src/zutil/algo/WienersAlgo.java b/src/zutil/algo/WienersAlgo.java index 3593df7..97b2cf6 100644 --- a/src/zutil/algo/WienersAlgo.java +++ b/src/zutil/algo/WienersAlgo.java @@ -46,6 +46,7 @@ public class WienersAlgo { d1 = g.multiply( d1 ).add( d0 ); d0 = t; + // (d1*e-1) % c1 == 0 n1 = d1.multiply( e ).subtract( BigInteger.ONE ); if( n1.mod( c1 ).equals( BigInteger.ZERO ) ){ n1 = n1.divide( c1 ); diff --git a/src/zutil/network/nio/NioNetwork.java b/src/zutil/network/nio/NioNetwork.java index 284a5a1..ea8f442 100644 --- a/src/zutil/network/nio/NioNetwork.java +++ b/src/zutil/network/nio/NioNetwork.java @@ -312,6 +312,7 @@ public abstract class NioNetwork implements Runnable { //pendingReadData.get(socketChannel).clear(); }catch(Exception e){ e.printStackTrace(); + //pendingReadData.get(socketChannel).reset(); } }