Multiply the big integer in place by base**power.
The exponent is consumed in the largest chunks whose power still fits
below LIMB_BASE, which is 29 for base two and 12 for base five.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=int64), | intent(inout) | :: | limb(:) | |||
| integer(kind=default_int), | intent(inout) | :: | n_limb | |||
| integer(kind=int64), | intent(in) | :: | base | |||
| integer(kind=default_int), | intent(in) | :: | power |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=default_int), | private | :: | chunk | ||||
| integer(kind=int64), | private | :: | factor | ||||
| integer(kind=default_int), | private | :: | remaining | ||||
| integer(kind=int64), | private | :: | step |
pure subroutine bd_mul_pow(limb, n_limb, base, power) !! Multiply the big integer in place by `base**power`. !! !! The exponent is consumed in the largest chunks whose power still fits !! below `LIMB_BASE`, which is 29 for base two and 12 for base five. integer(int64), intent(inout) :: limb(:) integer(default_int), intent(inout) :: n_limb integer(int64), intent(in) :: base integer(default_int), intent(in) :: power integer(default_int) :: chunk, remaining integer(int64) :: step, factor chunk = 0_default_int step = 1_int64 do while (step*base < LIMB_BASE) step = step*base chunk = chunk + 1_default_int end do remaining = power do while (remaining > 0_default_int) if (remaining >= chunk) then factor = step remaining = remaining - chunk else factor = base**remaining remaining = 0_default_int end if call bd_mul_small(limb, n_limb, factor) end do end subroutine bd_mul_pow