package umontreal.iro.lecuyer.hups;
/* *
 * Title:        

* Description:

* Copyright: Copyright (c)

* Company:

* @author * @version 1.0 */ import java.io.*; import java.util.*; /** * This class implements methods and fields needed by the classes * {@link umontreal.iro.lecuyer.hups.F2wNetLFSR F2wNetLFSR}, * {@link umontreal.iro.lecuyer.hups.F2wNetPolyLCG F2wNetPolyLCG}, * {@link umontreal.iro.lecuyer.hups.F2wCycleBasedLFSR F2wCycleBasedLFSR} and * {@link umontreal.iro.lecuyer.hups.F2wCycleBasedPolyLCG F2wCycleBasedPolyLCG}. * It also stores the parameters of these point sets which will contain * 2rw points (see the meaning of r and w below). * The parameters can be stored as a polynomial P(z) over * * F2w[z] *

*

*
* P(z) = zr + ∑i=1rbizr-i *

* where * bi∈F2w for * i = 1,…, r. * Let ζ be the root of an irreducible polynomial * * Q(z)∈F2[z]. It is well known * that ζ is a generator of the finite field * * F2w. * The elements of * F2w are * represented using the polynomial ordered * basis * (1, ζ,…, ζw-1). * *

* In this class, only the non-zero coefficients of P(z) are stored. * It is stored as *

*

*
* P(z) = zr + ∑i=0nbcoeffcoeff[i]znocoeff[i] *

* where the coefficients in coeff[] represent the non-zero * coefficients bi of P(z) using the polynomial basis. * The finite field * F2w used is * defined by the polynomial *

*

*
* Q(z) = zw + ∑i=1waizw-i *

* where * ai∈F2, * for * i = 1,…, w. Polynomial Q is * stored as the bit vector modQ = * (aw,…, a1). * *

* The class also stores the parameter step that is used by the classes * {@link umontreal.iro.lecuyer.hups.F2wNetLFSR F2wNetLFSR}, * {@link umontreal.iro.lecuyer.hups.F2wNetPolyLCG F2wNetPolyLCG}, * {@link umontreal.iro.lecuyer.hups.F2wCycleBasedLFSR F2wCycleBasedLFSR} and * {@link umontreal.iro.lecuyer.hups.F2wCycleBasedPolyLCG F2wCycleBasedPolyLCG}. * This parameter is such that the implementation of the recurrence * will output a value at every step iterations. * */ public class F2wStructure { private final int ALLONES = 2147483647; // 2^31-1 --> 01111...1 int w; int r; int numBits; private int modQ; private int step; private int[] coeff; private int[] nocoeff; private int nbcoeff; int S; private int maskw; private int maskrw; private int maskZrm1; private int mask31; private int t; private int masktrw; private int[] maskv; int state; int output; // augmented state double normFactor; double EpsilonHalf; final static int MBL = 140; //maximum of bytes in 1 line //92 bytes for a number of coeff = 15 private void init (int w, int r, int modQ, int step, int nbcoeff, int coeff[], int nocoeff[]) { normFactor = 1.0 / (1L << 31); // 4.65661287307739258e-10; EpsilonHalf = 0.5*normFactor; numBits = 31; this.step = step; this.w = w; this.r = r; S = 31 - r * w; mask31 = ~(1 << 31); maskw = (1 << w) - 1; maskrw = ((1 << (r * w)) - 1) << S; maskZrm1 = (ALLONES >> (r * w)) ^ (ALLONES >> ((r - 1) * w)); this.modQ = modQ; this.nbcoeff = nbcoeff; this.nocoeff = new int[nbcoeff]; this.coeff = new int[nbcoeff]; for (int j = 0; j < nbcoeff; j++) { this.nocoeff[j] = nocoeff[j]; this.coeff[j] = coeff[j]; } } void initParamLFSR () { t = (31 - r * w) / w; masktrw = (~0) << (31 - (t + r) * w) & mask31; maskv = new int[r]; for (int j = 0; j < r; j++) { maskv[j] = maskw << (S + ((r - 1 - j) * w)); } } /** * Constructs a F2wStructure object that contains the parameters of a * polynomial in * F2w[z], * as well as a stepping parameter. * */ F2wStructure (int w, int r, int modQ, int step, int nbcoeff, int coeff[], int nocoeff[]) { init (w, r, modQ, step, nbcoeff, coeff, nocoeff); } /** * Constructs a polynomial in * F2w[z] * after reading its parameters from file filename; * the parameters of this polynomial are stored at line number * no of filename. * The files are kept in different * directories depending on the criteria used in the searches for the * parameters defining the polynomials. The different criteria for the * searches and the theory behind it are described in. * The existing files and the number of polynomials they contain are * given in the following tables. * The first table below contains files in subdirectory * LFSR_equid_max. The name of each * file indicates the value of r and w for the polynomials. * For example, file f2wR2_W5.dat in directory * LFSR_equid_max contains the parameters of 2358 * polynomials with r = 2 and w = 5. For example, to use the 5-th * polynomial of file f2wR2_W5.dat, one may call * F2wStructure("f2wR2_W5.dat", 5). * The files of parameters have been stored at the address * http://www.iro.umontreal.ca/~simardr/ssj-1/dataF2w/. * */ F2wStructure (String filename, int no) { // If filename can be found starting from the program's directory, // it will be used; otherwise, the filename in the Jar archive will // be used. BufferedReader input; try { if ((new File (filename)).exists()) { input = new BufferedReader (new FileReader (filename)); } else { DataInputStream dataInput; dataInput = new DataInputStream ( F2wStructure.class.getClassLoader().getResourceAsStream ( "umontreal/iro/lecuyer/hups/dataF2w/" + filename)); input = new BufferedReader (new InputStreamReader (dataInput)); } initFromReader (filename, input, no); input.close (); } catch (Exception e) { System.out.println ("IO Error: problems finding file " + filename); System.exit (1); } } private int multiplyz (int a, int k) { int i; if (k == 0) return a & maskw; else { for (i = 0; i < k; i++) { if ((1 & a) == 1) { a = (a >> 1) ^ modQ; } else a = a >> 1; } return a & maskw; } } /** * This method returns the product rw. * */ int getLog2N () { return r * w; } /** * Method that multiplies two elements in * * F2w. * */ int multiply (int a, int b) { int i; int res = 0, verif = 1; for (i = 0; i < w; i++) { if ((b & verif) == verif) res ^= multiplyz (a, w - 1 - i); verif <<= 1; } return res & maskw; } void initF2wLFSR () // Initialisation de l'etat d'un LFSR { int v, d = 0; int tempState; tempState = state << S; output = tempState; for (int i = 1; i <= t; i++) { d = 0; for (int j = 0; j < nbcoeff; j++) { v = (tempState & maskv[nocoeff[j]]) >> (S + (r - 1 - nocoeff[j]) * w); d ^= multiply (coeff[j], v); } output |= d << (S - i * w); tempState = (output << (i * w)) & maskrw; } } void F2wLFSR () // Une iteration d'un LFSR { int v, d = 0; int tempState; for (int i = 0; i < step; i++) { tempState = (output << (t * w)) & maskrw; d = 0; for (int j = 0; j < nbcoeff; j++) { v = (tempState & maskv[nocoeff[j]]) >> (S + (r - 1 - nocoeff[j]) * w); d ^= multiply (coeff[j], v); } output = ((output << w) & masktrw) | (d << (31 - (r + t) * w)); } state = (output & maskrw) >> S; } int F2wPolyLCG () // Une iteration d'un PolyLCG { int Zrm1, d; for (int i = 0; i < step; i++) { Zrm1 = (state & maskZrm1) >> S; state = (state >> w) & maskrw; for (int j = 0; j < nbcoeff; j++) state ^= multiply (coeff[j], Zrm1) << (S + (r - 1 - nocoeff[j]) * w); } return state; } /** * Prints the content of file filename. See the constructor * above for the conditions on filename. * */ public static void print (String filename) { BufferedReader input; try { if ((new File (filename)).exists()) { input = new BufferedReader (new FileReader (filename)); } else { DataInputStream dataInput; dataInput = new DataInputStream ( F2wStructure.class.getClassLoader().getResourceAsStream ( "umontreal/iro/lecuyer/hups/dataF2w/" + filename)); input = new BufferedReader (new InputStreamReader (dataInput)); } String s; for (int i = 0; i < 4; i++) input.readLine (); while ((s = input.readLine ()) != null) System.out.println (s); input.close (); } catch (Exception e) { System.out.println ("IO Error: problems reading file " + filename); System.exit (1); } } /** * This method returns a string containing the polynomial P(z) and * the stepping parameter. * */ public String toString () { StringBuffer sb = new StringBuffer ("z^"); sb.append (r); for (int j = nbcoeff - 1; j >= 0; j--) sb.append (" + (" + coeff[j] + ") z^" + nocoeff[j]); sb.append (" modQ = " + modQ + " w = " + w + " step = " + step); return sb.toString (); } private void initFromReader (String filename, BufferedReader input, int no) { int w, r, modQ, step, nbcoeff; int coeff[], nocoeff[]; StringTokenizer line; int nl = no + 4; try { for (int j = 1; j < nl ; j++) input.readLine (); line = new StringTokenizer (input.readLine ()); w = Integer.parseInt (line.nextToken ()); r = Integer.parseInt (line.nextToken ()); modQ = Integer.parseInt (line.nextToken ()); step = Integer.parseInt (line.nextToken ()); nbcoeff = Integer.parseInt (line.nextToken ()); nocoeff = new int[nbcoeff]; coeff = new int[nbcoeff]; for (int i = 0; i < nbcoeff; i++) { coeff[i] = Integer.parseInt (line.nextToken ()); nocoeff[i] = Integer.parseInt (line.nextToken ()); } init (w, r, modQ, step, nbcoeff, coeff, nocoeff); input.close (); } catch (Exception e) { System.out.println ("Input Error: problems reading file " + filename); System.exit (1); } } } /** * . *

* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Directory LFSR_equid_max
FilenameNum of poly.
f2wR2_W5.dat2358
f2wR2_W6.dat1618
f2wR2_W7.dat507
f2wR2_W8.dat26
f2wR2_W9.dat3
f2wR3_W4.dat369
f2wR3_W5.dat26
f2wR3_W6.dat1
f2wR4_W3.dat117
f2wR4_W4.dat1
f2wR5_W2.dat165
f2wR5_W3.dat1
f2wR6_W2.dat36
f2wR6_W3.dat1
f2wR7_W2.dat10
f2wR8_W2.dat11
f2wR9_W2.dat1
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Directory LFSR_equid_sum
FilenameNum of poly.
f2wR2_W5.dat2276
f2wR2_W6.dat1121
f2wR2_W7.dat474
f2wR2_W8.dat37
f2wR2_W9.dat6
f2wR3_W4.dat381
f2wR3_W5.dat65
f2wR3_W6.dat7
f2wR4_W3.dat154
f2wR4_W4.dat2
f2wR5_W2.dat688
f2wR5_W3.dat5
f2wR6_W2.dat70
f2wR6_W3.dat1
f2wR7_W2.dat9
f2wR8_W2.dat3
f2wR9_W2.dat3
*

*
*

* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Directory LFSR_mindist_max
FilenameNum of poly.
f2wR2_W5.dat1
f2wR2_W6.dat1
f2wR2_W7.dat2
f2wR2_W8.dat2
f2wR2_W9.dat1
f2wR3_W4.dat2
f2wR3_W5.dat2
f2wR3_W6.dat1
f2wR4_W3.dat1
f2wR4_W4.dat1
f2wR5_W2.dat2
f2wR5_W3.dat1
f2wR6_W2.dat4
f2wR6_W3.dat1
f2wR7_W2.dat1
f2wR8_W2.dat1
f2wR9_W2.dat1
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Directory LFSR_mindist_sum
FilenameNum of poly.
f2wR2_W5.dat1
f2wR2_W6.dat1
f2wR2_W7.dat1
f2wR2_W8.dat1
f2wR2_W9.dat1
f2wR3_W4.dat1
f2wR3_W5.dat1
f2wR3_W6.dat1
f2wR4_W3.dat1
f2wR4_W4.dat2
f2wR5_W2.dat2
f2wR5_W3.dat2
f2wR6_W2.dat1
f2wR6_W3.dat1
f2wR7_W2.dat2
f2wR8_W2.dat1
f2wR9_W2.dat2
*

*

*

* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Directory LFSR_tvalue_max
FilenameNum of poly.
f2wR2_W5.dat7
f2wR2_W6.dat1
f2wR2_W7.dat1
f2wR2_W8.dat1
f2wR2_W9.dat1
f2wR3_W4.dat1
f2wR3_W5.dat1
f2wR3_W6.dat1
f2wR4_W3.dat2
f2wR4_W4.dat1
f2wR5_W2.dat14
f2wR5_W3.dat1
f2wR6_W2.dat2
f2wR6_W3.dat1
f2wR7_W2.dat1
f2wR8_W2.dat1
f2wR9_W2.dat1
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Directory LFSR_tvalue_sum
FilenameNum of poly.
f2wR2_W5.dat15
f2wR2_W6.dat1
f2wR2_W7.dat1
f2wR2_W8.dat2
f2wR2_W9.dat1
f2wR3_W4.dat1
f2wR3_W5.dat1
f2wR3_W6.dat1
f2wR4_W3.dat2
f2wR4_W4.dat1
f2wR5_W2.dat13
f2wR5_W3.dat2
f2wR6_W2.dat12
f2wR6_W3.dat1
f2wR7_W2.dat1
f2wR8_W2.dat1
f2wR9_W2.dat1
*/

Ads help maintain this website.