protected static void bitReverse(int[] A, int logN) {
    int[] temp = new int[A.length];
    for (int i=0; i<A.length; i++)
      temp[reverse[i]] = A[i];
    for (int i=0; i<A.length; i++)
      A[i] = temp[i];
  }
  protected static int[] reverseArray(int n, int logN) {
    int[] result = new int[n];
    for (int i=0; i<n; i++)
      result[i] = reverse(i,logN);
    return result;
  }
  protected static int reverse(int N, int logN) {
    int bit=0;
    int result=0;
    for (int i=0; i<logN; i++) {
      bit = N & 1;
      result = (result << 1) + bit;
      N = N >>> 1;
      }
    return result;
    }