@@ -33,13 +33,14 @@ <h2>Editor</h2>
3333 < button id ="run-btn " onclick ="runCode() "> ▶ RUN</ button >
3434 </ div >
3535 < textarea id ="code " spellcheck ="false ">
36- primes = primes(200000);
36+ const maxn = 200000;
37+ primes = primes(maxn);
3738plot(count(primes));
3839plot(x => ceil(x / ln(x)));
3940plot(x => ceil(x / ln(x) + x / pow(ln(x), 2)));
4041plot(x => floor(li(x)));
4142plot(x => Math.ceil(x / (ln(x) - 1)));
42- maybeprimes = maybePrimes(200000, [] );
43+ maybeprimes = maybePrimes(maxn );
4344plot(count(maybeprimes));
4445
4546//plot(x => cgamma(complex(0, x)).y);
@@ -127,42 +128,35 @@ <h2>Editor</h2>
127128const relumin = ( x ) => x >= 0 ? undefined : x ;
128129const relumax = ( x ) => x <= 0 ? undefined : x ;
129130function gcd ( a , b ) {
130- while ( b ) {
131- [ a , b ] = [ b , a % b ] ;
132- }
133- return a ;
134- }
135- function primes ( n ) {
136- const seq = [ ] ;
137- for ( let i = 2 ; i <= n ; i ++ ) {
138- let isPrime = true ;
139- for ( let j = 2 ; j * j <= i ; j ++ ) {
140- if ( i % j === 0 ) { isPrime = false ; break ; }
141- }
142- if ( isPrime ) { seq . push ( i ) ; }
131+ a = a < 0 ? - a : a ;
132+ b = b < 0 ? - b : b ;
133+ while ( b !== 0 ) {
134+ const t = a % b ;
135+ a = b ;
136+ b = t ;
143137 }
144- return seq ;
138+ return a ;
145139}
146140
147141function factorial ( n ) {
148- if ( n <= 0 ) return [ ] ;
149- const seq = [ 1 ] ;
150- for ( let i = 2 ; i <= n ; i ++ ) {
151- seq . push ( seq [ seq . length - 1 ] * i ) ;
152- }
153- return seq ;
142+ if ( n <= 0 ) return [ ] ;
143+ const seq = [ 1 ] ;
144+ for ( let i = 2 ; i <= n ; i ++ ) {
145+ seq . push ( seq [ seq . length - 1 ] * i ) ;
146+ }
147+ return seq ;
154148}
155149
156150function isprime ( x ) {
157- if ( x < 2 ) { return false ; }
158- if ( x <= 3 ) { return true ; }
159- if ( x % 2 === 0 || x % 3 === 0 ) { return false ; }
160- for ( let i = 5 ; i * i <= x ; i += 6 ) {
161- if ( x % i === 0 || x % ( i + 2 ) === 0 ) {
162- return false ;
163- }
151+ if ( x < 2 ) { return false ; }
152+ if ( x <= 3 ) { return true ; }
153+ if ( x % 2 === 0 || x % 3 === 0 ) { return false ; }
154+ for ( let i = 5 ; i * i <= x ; i += 6 ) {
155+ if ( x % i === 0 || x % ( i + 2 ) === 0 ) {
156+ return false ;
164157 }
165- return true ;
158+ }
159+ return true ;
166160}
167161
168162// According to this logic, almost all functions can be turned into prime versions. like fib-prime or mersenne-prime with add condition
@@ -395,36 +389,124 @@ <h2>Editor</h2>
395389 return num ;
396390}
397391
398- const SEED = Math . random ( ) ;
399- function rand ( n ) {
400- let x = ( n * 374761393 + SEED * 668265263 ) >>> 0 ;
392+ function modPow ( base , exp , mod ) {
393+ let result = 1 ;
394+ base %= mod ;
395+ while ( exp > 0 ) {
396+ if ( exp & 1 ) {
397+ result = ( result * base ) % mod ;
398+ }
399+ base = ( base * base ) % mod ;
400+ exp >>= 1 ;
401+ }
402+ return result ;
403+ }
404+
405+ function isMillerPrime ( n , primes = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 , 79 , 83 , 89 , 97 ] ) {
406+ if ( n < 2 ) return false ;
407+ for ( const p of primes ) {
408+ if ( n % p === 0 ) {
409+ return n === p ;
410+ }
411+ }
412+ let d = n - 1 ;
413+ let s = 0 ;
414+ while ( ( d & 1 ) === 0 ) {
415+ d /= 2 ;
416+ s ++ ;
417+ }
418+ const witnesses = [ 2 , 325 , 9375 , 28178 , 450775 , 9780504 , 1795265022 ] ;
419+ for ( let a of witnesses ) {
420+ a %= n ;
421+ if ( a === 0 ) continue ;
422+ let x = modPow ( a , d , n ) ;
423+ if ( x === 1 || x === n - 1 ) {
424+ continue ;
425+ }
426+ let composite = true ;
427+ for ( let r = 1 ; r < s ; r ++ ) {
428+ x = ( x * x ) % n ;
429+ if ( x === n - 1 ) {
430+ composite = false ;
431+ break ;
432+ }
433+ }
434+ if ( composite ) {
435+ return false ;
436+ }
437+ }
438+ return true ;
439+ }
440+
441+ function rand ( n , seed ) {
442+ let x = ( n * 374761393 + seed * 668265263 ) >>> 0 ;
401443 x = ( ( x ^ ( x >>> 13 ) ) * 1274126177 ) >>> 0 ;
402444 x = ( x ^ ( x >>> 16 ) ) >>> 0 ;
403445 return x / 4294967296 ;
404446}
405447
406- function isMaybePrime ( n , primes = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 ] ) {
448+ function isMaybePrime ( n , primes = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 ] , seed = 18 ) {
407449 const num = Math . ceil ( Math . abs ( n ) ) ;
408450 if ( num <= 1 ) return false ;
409451 if ( primes . includes ( num ) ) return true ;
410452 for ( const prime of primes ) {
411453 if ( num % prime === 0 ) return false ;
412454 }
413- let W = 1 ;
455+ let w = 1 ;
414456 for ( const prime of primes ) {
415- W *= ( 1 - 1 / prime ) ;
457+ w *= ( 1 - 1 / prime ) ;
458+ }
459+ return rand ( n , seed ) < 1 / ( Math . log ( num ) * w ) ;
460+ }
461+
462+ function maybePrimes ( n , primes = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 ] , seed = 18 ) {
463+ let arr = [ ] ;
464+ for ( let i = 0 ; i < n ; i ++ ) {
465+ if ( isMaybePrime ( i , primes , seed ) ) {
466+ arr . push ( i ) ;
467+ }
416468 }
417- return rand ( n ) < 1 / Math . log ( num ) / W ;
469+ /*let upperBound = [];
470+ let lowerBound= [];
471+ for (let x = 2; x <= arr.length; x++) {
472+ upperBound.push(Math.ceil(x * (Math.log(x) + Math.log(Math.log(x)) - 0.8)));
473+ lowerBound.push(Math.ceil(x * (Math.log(x) + Math.log(Math.log(x)) - 1.0)));
474+ }*/
475+ return arr ;
418476}
419477
420- function maybePrimes ( n , primes = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 ] ) {
478+ function millerPrimes ( n , primes = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 ] ) {
421479 let arr = [ ] ;
422- for ( let i = 0 ; i < n ; i ++ ) {
423- if ( isMaybePrime ( i , primes ) ) { arr . push ( i ) }
480+ for ( let i = 0 ; i < n ; i ++ ) {
481+ if ( isMillerPrime ( i , primes ) ) {
482+ arr . push ( i ) ;
483+ }
424484 }
425485 return arr ;
426486}
427487
488+ function seqPrimes ( n , primes = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 ] ) {
489+ let arr = [ ] ;
490+ for ( let i = 0 ; i < n ; i ++ ) {
491+ if ( isprime ( i ) ) {
492+ arr . push ( i ) ;
493+ }
494+ }
495+ return arr ;
496+ }
497+
498+ function primes ( n ) {
499+ const seq = [ ] ;
500+ for ( let i = 2 ; i <= n ; i ++ ) {
501+ let isPrime = true ;
502+ for ( let j = 2 ; j * j <= i ; j ++ ) {
503+ if ( i % j === 0 ) { isPrime = false ; break ; }
504+ }
505+ if ( isPrime ) { seq . push ( i ) ; }
506+ }
507+ return seq ;
508+ }
509+
428510function count ( arr ) {
429511 if ( ! arr . length ) return [ ] ;
430512 const max = arr . reduce ( ( m , x ) => ( x > m ? x : m ) , - Infinity ) ;
0 commit comments