mul method

void mul(
  1. MPData ret,
  2. MPData a,
  3. MPData b
)

Implementation

void mul( MPData ret, MPData a, MPData b ){
	a = clone( a );
	b = clone( b );

	int k = 1;
	if( a.val(0) < 0 && b.val(0) >= 0 ){ k = -1; }
	if( b.val(0) < 0 && a.val(0) >= 0 ){ k = -1; }

	int la = getLen( a );
	int lb = getLen( b );

	if( la == 0 || lb == 0 ){
		ret.set( 0, 0 );
		return;
	}

	int c = 0;
	if( la == 1 ){
		c = _mul1n( ret, b, a.val(1), lb );
	} else if( lb == 1 ){
		c = _mul1n( ret, a, b.val(1), la );
	} else {
		_fill( 0, ret, 1, la + lb );
		int aa, bb = 0;
		int i, j, x;
		for( j = 1; j <= lb; j++ ){
			c = 0;
			bb++;
			aa = 0;
			for( i = 1; i <= la; i++ ){
				x = a.val(++aa) * b.val(bb) + ret.val(i + j - 1) + c;
				ret.set( i + j - 1, ClipMath.imod( x, element ) );
				c = x ~/ element;
			}
			ret.set( i + j - 1, c );
		}
	}

	_setLen( ret, (c != 0 ? la + lb : la + lb - 1) * k );
}