login

Year-end appeal: Please make a donation to the OEIS Foundation to support ongoing development and maintenance of the OEIS. We are now in our 61st year, we have over 378,000 sequences, and we’ve reached 11,000 citations (which often say “discovered thanks to the OEIS”).

A346495
Smallest a(n) so that division by n can be performed by floor(x/n) = floor(x*a(n)/2^A346496(n)) for any 0 <= x < 2^32.
1
1, 1, 2863311531, 1, 3435973837, 2863311531, 4908534053, 1, 954437177, 3435973837, 3123612579, 2863311531, 1321528399, 4908534053, 2290649225, 1, 4042322161, 954437177, 7233629131, 3435973837, 6544712071, 3123612579, 2987803337, 2863311531, 1374389535
OFFSET
1,3
COMMENTS
This sequence is used for division by multiplication with an approximation of the inverse of the divisor on computers if they support multiplying two 32-bit numbers for a 64-bit result. This is usually much faster than a division instruction because integer division is a very slow operation on most computers.
If x and n are unsigned 32-bit quantities, x/n is replaced by (in C notation) ((uint64_t) a(n) * (uint64_t) x) >> b where b is A346496(n).
If n = 2^k, then m=1 and b=k (where the multiplication does not have to be performed).
All a(n) are smaller than 2^33. Those a(n) larger than 2^32, such as a(7), cannot be used directly if the arithmetic is restricted to 32-bit. In this case, the following sequence can be used, in C code again, where all quantities (also intermediate) are unsigned 32-bit integers:
m = a(n) - 2^32; /* Precomputed constant */
mb = b - 33; /* Precomputed constant, b is A346496(n) */
q = ((uint64_t) m * (uint64_t) x) >> 32;
t = (x - q)/2 + q;
res = t >> mb; [Corrected by Baard Nossum, Jul 15 2024]
REFERENCES
Henry S. Warren, Hacker's Delight, 2nd edition, Addison-Wesley, 2013, pp. 230-234, "Unsigned Division by Divisors >= 1"
FORMULA
If n is a power of two, a(n) = 1.
Otherwise, let n_c = 2^32 - (2^32 mod n) - 1 and search for the lowest b so that 2^b > n_c * (n-1- ((2^b-1) mod n)). Then, a(n) = (2^b + n - 1 - ((2^b - 1) mod n))/n, where b is A346496(n).
EXAMPLE
For n=3, m = a(3) = 2863311531 = (2^33 + 1)/3 = AAAAAAAB in base 16, b = A346496(3) = 33, so for 0 <= x < 2^32, x/3 = floor (x*2863311531 / 2^33). For x=11111, a(n)*x = 31814254420941, and floor(31814254420941/2^33) = 3703 = floor(11111/3).
For n=7, on a system where 64-bit arithmetic is not available:
m = 4908534053 - 2^32 = 61356675, so for x=12345, m*x = 757448152875, q=(m*x)>>32 = 1763, x-q = 10582, (x-q)/2 + q = 7054, res = 7054/4 = 1763 = floor(12345/7).
PROG
(PARI) for(n=1, 25, my(k, j=ispower(n, , &k), n_c=2^32-2^32%n-1, b=1); if(j&&k==2, print1(1, ", "), while(b<=n_c*(n-1-(b-1)%n), b+=b); print1((b+n-1-((b-1)%n))/n, ", "))) \\ Hugo Pfoertner, Aug 24 2021
(Python)
def power2(n): return n == 2**(n.bit_length()-1)
def a(n):
if power2(n): return 1
n_c, b = 2**32 - (2**32%n) - 1, 1
while 2**b <= n_c * (n - 1 - ((2**b - 1)%n)): b += 1
return (2**b + n - 1 - ((2**b - 1)%n))//n
print([a(n) for n in range(1, 26)]) # Michael S. Branicky, Aug 24 2021
CROSSREFS
A346496 gives the corresponding values for b.
Sequence in context: A327835 A295468 A257913 * A072017 A116577 A067615
KEYWORD
nonn,easy,fini
AUTHOR
Thomas König, Jul 20 2021
STATUS
approved