Looking for something similar to Python's bisect_right
qznc
qznc at web.de
Wed Oct 30 07:17:21 PDT 2013
On Wednesday, 30 October 2013 at 06:04:36 UTC, Zeke wrote:
> Hello, I'm on day 2 of learning D. I've learned C, C++, Java,
> Python, Ruby in University, but I wanted to broaden my palette
> by picking up D.
>
> This project is a basic implementation of Project Euler problem
> 10. I build an array of primes, and for each new test number I
> check if the test is divisible by any prime from 2 to
> sqrt(test) (which cuts down on number of iterations). Trouble
> is, I can't find a method that's in the libraries to calculate
> the index of where sqrt(test) would exist or would be inserted
> into a sorted array.
>
> I tried casting the primes array to a SortedRange using
> assumeSorted() but it didn't work for me. countUntil() returns
> -1 if the value doesn't exist. and I didn't find anything in
> the std.algorithm, std.array, or std.container.
>
> Here's my current working implementation of is_prime and the
> functions it uses:
>
> pure nothrow @safe bool is_prime(in ulong[] primes, ulong num) {
> // Need to find a more elegant way to find the index of
> where a number's
> // square root would be in a sorted array.
> auto upper = insind(primes,
> cast(ulong)sqrt(cast(double)num)) + 1;
> // Check each prime in the array up to the square root of
> our current test
> // number to see if it is prime.
> foreach(ulong prime; primes[0..upper]) {
> if (num % prime == 0) {
> return false;
> }
> }
> return true;
> }
Why do you want to find the exact prime first? Just check against
sqrt(num) in the loop.
auto upper = cast(ulong)sqrt(cast(double)num)) + 1;
foreach(ulong prime; primes) {
if (prime > upper) return true;
if (num % prime == 0) return false;
}
assert (false); // should be unreachable?
More information about the Digitalmars-d-learn
mailing list