/** * 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(); }
/* (non-Javadoc) * @see net.cbtltd.client.field.AbstractField#setValue(java.lang.Object) */ public void setValue(LatLng value) { this.value = value; super.setChanged(); }
/* (non-Javadoc) * @see net.cbtltd.client.field.AbstractField#setEnabled(boolean) */ @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); field.setEnabled(isEnabled()); }
/* (non-Javadoc) * @see net.cbtltd.client.field.AbstractField#onReset() */ @Override public void onReset() { value = defaultValue; field.setText(Model.BLANK); super.setChanged(); }