File tree Expand file tree Collapse file tree 2 files changed +44
-0
lines changed Expand file tree Collapse file tree 2 files changed +44
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * @description counts the positive integers up to a given integer n that are relatively prime to n.
3+ * @param {number } n - A natural number.
4+ * @return {number } - euler's totient.
5+ * @see https://en.wikipedia.org/wiki/Euler%27s_totient_function
6+ * @example phi(4) = 2
7+ * @example phi(5) = 4
8+ */
9+ export const phi = ( n : number ) : number => {
10+ let result : number = n ;
11+ for ( let i = 2 ; i * i <= n ; i ++ ) {
12+ if ( n % i == 0 ) {
13+ while ( n % i == 0 ) n = n / i ;
14+ result -= Math . floor ( result / i ) ;
15+ }
16+ }
17+ if ( n > 1 ) result -= Math . floor ( result / n ) ;
18+
19+ return result ;
20+ } ;
Original file line number Diff line number Diff line change 1+ import { phi } from "../euler_totient" ;
2+
3+
4+ const cases : [ number , number ] [ ] = [
5+ [ 4 , 2 ] ,
6+ [ 5 , 4 ] ,
7+ [ 7 , 6 ] ,
8+ [ 10 , 4 ] ,
9+ [ 999 , 648 ] ,
10+ [ 1000 , 400 ] ,
11+ [ 1000000 , 400000 ] ,
12+ [ 999999 , 466560 ] ,
13+ [ 999999999999878 , 473684210526240 ] ,
14+ ] ;
15+
16+ describe ( "phi" , ( ) => {
17+
18+ test . each ( cases ) (
19+ "phi of %i should be %i" ,
20+ ( num , expected ) => {
21+ expect ( phi ( num ) ) . toBe ( expected ) ;
22+ } ,
23+ ) ;
24+ } ) ;
You can’t perform that action at this time.
0 commit comments