Hone logo
Hone
Problems

Type-Level Prime Number Checker in TypeScript

Prime numbers are fundamental in number theory and cryptography. Being able to check for primality at the type level in TypeScript allows for compile-time validation of numerical constraints, leading to more robust and secure code by catching potential errors before runtime.

Problem Description

Your task is to create a TypeScript type IsPrime<N> that determines whether a given non-negative integer N is a prime number at compile time. A prime number is a natural number greater than 1 that has no positive divisors other than 1 and itself.

Key Requirements:

  1. IsPrime<N> Type: Define a generic type IsPrime<N> that takes a number literal N as its type argument.
  2. Boolean Output: The IsPrime<N> type should resolve to true if N is prime, and false otherwise.
  3. Handle Edge Cases: Correctly handle numbers 0, 1, and 2.
  4. Efficiency: While perfect type-level efficiency is difficult, aim for a reasonably performant solution that doesn't lead to excessive compilation times for moderate input numbers.

Expected Behavior:

  • IsPrime<2> should be true.
  • IsPrime<3> should be true.
  • IsPrime<4> should be false.
  • IsPrime<5> should be true.
  • IsPrime<17> should be true.
  • IsPrime<18> should be false.
  • IsPrime<0> should be false.
  • IsPrime<1> should be false.

Examples

Example 1:

// Input: IsPrime<7>
// Output: true
type PrimeSeven = IsPrime<7>; // Expected to resolve to true

Explanation: 7 is greater than 1 and its only positive divisors are 1 and 7.

Example 2:

// Input: IsPrime<10>
// Output: false
type PrimeTen = IsPrime<10>; // Expected to resolve to false

Explanation: 10 is divisible by 2 and 5, in addition to 1 and 10.

Example 3: (Edge Case)

// Input: IsPrime<1>
// Output: false
type PrimeOne = IsPrime<1>; // Expected to resolve to false

Explanation: By definition, 1 is not a prime number.

Example 4: (Edge Case)

// Input: IsPrime<0>
// Output: false
type PrimeZero = IsPrime<0>; // Expected to resolve to false

Explanation: By definition, prime numbers are natural numbers greater than 1.

Constraints

  • The input N will be a non-negative integer literal.
  • The maximum value for N to be tested will be up to 1000 to ensure reasonable compilation times.
  • Solutions relying on external libraries or any runtime execution are not permitted. This must be purely a type-level operation.

Notes

  • This challenge involves advanced TypeScript type manipulation, specifically leveraging conditional types and recursive type definitions.
  • Consider how you will handle checking for divisibility. You might need helper types to perform operations like subtraction or modulo at the type level.
  • A common approach for type-level primality testing involves checking divisibility from 2 up to the square root of N. However, implementing square root at the type level can be complex. A simpler, though less efficient, approach is to check divisibility from 2 up to N-1. For the given constraint of N <= 1000, this simpler approach should suffice.
  • Remember to define the base cases correctly (0, 1, 2).
  • Think about how to represent subtraction and comparison of numbers at the type level. You might need to create types like Subtract<A, B> and IsGreater<A, B>.
Loading editor...
typescript