Предполагая, что вам нужны только числа, меньшие x
, которые взаимно просты с ним - вы также можете использовать генеративный подход, используя специальный тип сита.Когда сгенерированы кратные каждого простого числа, вы увидите, если эта последовательность"достигнет" вашего верхнего предела x
или пропустит его, и пометит все числа в нем как не взаимно простые, если он достигнетx
.
Или в «псевдокоде» (с синтаксисом Haskell :)),
coprimes n = go( [1..n-1], [2..n-1]) where
go( xs, [] ) = xs -- ' no more numbers to sieve - return xs
go( xs, p:ks ) = -- ' p is first in candidates, ks is the rest
let ms = [p, 2*p .. n-1] -- ' p's multiples
in
go( if ( (mod n p) == 0 ) -- ' is n a multiple of p ?
then (xs\\ms) -- ' yes: remove p's multiples
else xs, -- ' no: possible coprimes
ks\\ms ) -- ' candidates to sieve
Разность множеств в Haskell \\
очень неэффективна с неупорядоченным представлением списков множеств, но вы, естественно, закодируете этоэффективно, поверх изменяемых массивов, в VB.