Hone logo
Hone
Problems

Type-Level Prime Number Checker in TypeScript

This challenge asks you to implement a type-level function in TypeScript that determines whether a given number, represented as a type, is a prime number. Type-level programming allows us to perform computations and logic directly within the type system, enabling powerful compile-time validations and optimizations. This exercise will test your understanding of conditional types, recursive types, and potentially distributive conditional types in TypeScript.

Problem Description

You need to create a type IsPrime<N> where N is a number represented as a type (e.g., 1 is represented as 1 extends 1 ? true : false). The IsPrime<N> type should resolve to true if N is a prime number and false otherwise.

A prime number is a natural number greater than 1 that has no positive divisors other than 1 and itself. Therefore, to determine if a number N is prime, you need to check if it's divisible by any number from 2 up to the square root of N. Since we're working at the type level, we'll represent divisibility using conditional types and recursion.

Key Requirements:

  • The solution must be purely type-level; no runtime code is allowed.
  • The solution should handle numbers from 2 upwards. Numbers less than 2 should be considered non-prime.
  • The solution should be efficient in terms of type complexity. Avoid unnecessary type recursion.
  • The solution should correctly identify prime numbers.

Expected Behavior:

  • IsPrime<2> should resolve to true.
  • IsPrime<3> should resolve to true.
  • IsPrime<4> should resolve to false.
  • IsPrime<5> should resolve to true.
  • IsPrime<6> should resolve to false.
  • IsPrime<7> should resolve to true.
  • IsPrime<8> should resolve to false.
  • IsPrime<9> should resolve to false.
  • IsPrime<10> should resolve to false.
  • IsPrime<11> should resolve to true.
  • IsPrime<1> should resolve to false.
  • IsPrime<0> should resolve to false.

Examples

Example 1:

Input: IsPrime<5>
Output: true
Explanation: 5 is only divisible by 1 and 5, therefore it is prime.

Example 2:

Input: IsPrime<4>
Output: false
Explanation: 4 is divisible by 2, therefore it is not prime.

Example 3:

Input: IsPrime<1>
Output: false
Explanation: 1 is not a prime number.

Constraints

  • N will be a number represented as a type, typically a union of types representing the number.
  • The solution should be reasonably performant in terms of type checking time. Extremely complex or deeply recursive type definitions can lead to compiler errors or very long compilation times.
  • The solution should handle numbers up to a reasonable limit (e.g., 20). While there's no strict upper bound, extremely large numbers will likely cause type checking issues.

Notes

  • Consider using distributive conditional types to iterate through potential divisors.
  • You can represent divisibility by checking if N is assignable to DivisibleBy<N, D>, where DivisibleBy<N, D> is a type that checks if N is divisible by D.
  • Think about how to efficiently calculate the square root of N at the type level (you don't need to calculate the exact square root, just a value close enough to stop the divisibility checks). You can use a type that represents the integer part of the square root.
  • Start with smaller prime numbers (2, 3, 5, 7) and gradually increase the complexity.
  • Remember that TypeScript's type system has limitations. Extremely complex type-level computations can lead to compiler errors. Strive for clarity and efficiency.
Loading editor...
typescript