/**
   * Builds k-bit lookup window for base a
   *
   * @param k
   * @return
   */
  protected List<Element> buildPowWindow(int k) {
    int s;
    int lookupSize;
    List<Element> lookup;

    if (k < 1) {
      /* no window */
      return null;
    }

    /* build 2^k lookup table. lookup[i] = x^i. */
    /*
     * TODO(-): a more careful word-finding algorithm would allow us to
     * avoid calculating even lookup entries > 2
     */
    lookupSize = 1 << k;
    lookup = new ArrayList<Element>(lookupSize);

    lookup.add(field.newOneElement());
    for (s = 1; s < lookupSize; s++) {
      lookup.add(lookup.get(s - 1).duplicate().mul(this));
    }

    return lookup;
  }
  private void setNotNull(final AbstractField field) {
    field.setImmediate(true);
    if (nullorempty(field.getValue())) {
      errors.add(field);
      save.setEnabled(false);
    }

    field.addValueChangeListener(
        new Property.ValueChangeListener() {
          @Override
          public void valueChange(Property.ValueChangeEvent valueChangeEvent) {
            if (nullorempty(field.getValue())) errors.add(field);
            else errors.remove(field);
            save.setEnabled(errors.isEmpty());
          }
        });
  }
  /**
   * left-to-right exponentiation with k-bit window. NB. must have k >= 1.
   *
   * @param n
   */
  protected void elementPowWind(BigInteger n) {
    /* early abort if raising to power 0 */
    if (n.signum() == 0) {
      setToOne();
      return;
    }

    int word = 0; /* the word to look up. 0<word<base */
    int wbits = 0; /* # of bits so far in word. wbits<=k. */
    int k = optimalPowWindowSize(n);
    List<Element> lookup = buildPowWindow(k);
    Element result = field.newElement().setToOne();

    for (int inword = 0, s = n.bitLength() - 1; s >= 0; s--) {
      result.square();
      int bit = n.testBit(s) ? 1 : 0;

      if (inword == 0 && bit == 0) continue; /* keep scanning. note continue. */

      if (inword == 0) {
        /* was scanning, just found word */
        inword = 1; /* so, start new word */
        word = 1;
        wbits = 1;
      } else {
        word = (word << 1) + bit;
        wbits++; /* continue word */
      }

      if (wbits == k || s == 0) {
        result.mul(lookup.get(word));
        inword = 0;
      }
    }

    set(result);
  }
  public Element mul(int z) {
    mul(field.newElement().set(z));

    return this;
  }
 public Element halve() {
   return mul(field.newElement().set(2).invert());
 }
 public int getLengthInBytes() {
   return field.getLengthInBytes();
 }
Exemplo n.º 7
0
 /* (non-Javadoc)
  * @see net.cbtltd.client.field.AbstractField#setValue(java.lang.Object)
  */
 public void setValue(LatLng value) {
   this.value = value;
   super.setChanged();
 }
Exemplo n.º 8
0
 /* (non-Javadoc)
  * @see net.cbtltd.client.field.AbstractField#setEnabled(boolean)
  */
 @Override
 public void setEnabled(boolean enabled) {
   super.setEnabled(enabled);
   field.setEnabled(isEnabled());
 }
Exemplo n.º 9
0
 /* (non-Javadoc)
  * @see net.cbtltd.client.field.AbstractField#onReset()
  */
 @Override
 public void onReset() {
   value = defaultValue;
   field.setText(Model.BLANK);
   super.setChanged();
 }