libbb: move isqrt from factor, use it in diff too
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		| @@ -44,24 +44,7 @@ typedef unsigned long half_t; | ||||
| #error Cant find an integer type which is half as wide as ullong | ||||
| #endif | ||||
|  | ||||
| /* Returns such x that x+1 > sqrt(N) */ | ||||
| static inline half_t isqrt(wide_t N) | ||||
| { | ||||
| 	half_t x; | ||||
| 	unsigned shift; | ||||
|  | ||||
| 	shift = WIDE_BITS - 2; | ||||
| 	x = 0; | ||||
| 	do { | ||||
| 		x = (x << 1) + 1; | ||||
| 		if ((wide_t)x * x > (N >> shift)) | ||||
| 			x--; /* whoops, that +1 was too much */ | ||||
| 		shift -= 2; | ||||
| 	} while ((int)shift >= 0); | ||||
| 	return x; | ||||
| } | ||||
|  | ||||
| static NOINLINE half_t isqrt_odd(wide_t N) | ||||
| static half_t isqrt_odd(wide_t N) | ||||
| { | ||||
| 	half_t s = isqrt(N); | ||||
| 	/* Subtract 1 from even s, odd s won't change: */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user