code: public FDBigInt
      mult( FDBigInt other ){
          // crudely guess adequate size for r
          int r[] = new int[ nWords + other.nWords ];
          int i;
          // I think I am promised zeros...
  
          for( i = 0; i < this.nWords; i++ ){
              long v = (long)this.data[i] & 0xffffffffL; // UNSIGNED CONVERSION
              long p = 0L;
              int j;
              for( j = 0; j < other.nWords; j++ ){
                  p += ((long)r[i+j]&0xffffffffL) + v*((long)other.data[j]&0xffffffffL); // UNSIGNED CONVERSIONS ALL 'ROUND.
                  r[i+j] = (int)p;
                  p >>>= 32;
              }
              r[i+j] = (int)p;
          }
          // compute how much of r we actually needed for all that.
          for ( i = r.length-1; i> 0; i--)
              if ( r[i] != 0 )
                  break;
          return new FDBigInt( r, i+1 );
      }
docs: /*
  Multiply a FDBigInt by another FDBigInt.
  Result is a new FDBigInt.