Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sun, 26 Jun 2011 14:33:44 -0400
From: Rich Felker <dalias@...ifal.cx>
To: musl@...ts.openwall.com
Subject: Re: math argument reduction

On Sun, Jun 26, 2011 at 08:04:02PM +0200, Szabolcs Nagy wrote:
> dalias, i thought about the simple argument reduction method
> you proposed on irc, imho it won't be that good
> 
> the task is to calculate X mod M, so to get the fractional part of
> x = X/M
> you said you would treat X as a sum (of 2^n terms) let's say
> X = A+B
> and assume we have precalculated a=A/M and b=B/M in a table, then
> x = a+b
> is easy to get
> 
> but it well might be that the form of a+b is
> 
> [..]1011 . 0000000000000001101011[..]
> 
> so the fractional part has many leading zeros
> (it can be as many as 61) so you need to store a and b
> with large precision to get good floating point representation
> of the fractional part
> (53 + 61 bits precision + some extra bits for rounding)
> 
> so you need to store and do arithmetics with 120bit fixpoint values

I think you misunderstood my algorithm. You never need to compute X/M.
It's A%M and B%M, not A/M and B/M, which you have precalculated in
your tables. And therefore, (A+B)%M is congruent to A%M + B%M. In
general it could be outside the interval [0,M), but not by so much
that it's hard to get a good answer.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.