Skip to main content

Python library for number classification — 2140+ named number types, zero dependencies

Project description

numclassify

PyPI version Downloads Python Tests License

Coverage

What's new in v0.8.3

  • why_hidden(property, n) -- explanation with verdict stripped, for practice/quiz mode
  • practice_set(property, count, seed) -- balanced random YES/NO question generator
  • PRACTICE_TYPES -- allowlist of 22 ICSE Class 10 syllabus types
  • CLI numclassify quiz -- interactive practice mode
  • Playground Practice tab -- guess-then-reveal quiz flow

Given a number, what is it?

Most number-theory libraries -- labmath, eulerlib, pyntlib -- compute things: factor integers, find GCDs, generate primes. numclassify solves a different problem. Hand it a number and it tells you every named mathematical type that number belongs to, across 2140+ categories, with zero external dependencies.

Why I built this

I was doing number programs in school (Armstrong numbers, perfect numbers, that kind of thing) and went looking for a Python package I could just import instead of rewriting the same checks every time. I couldn't find one. Every library I found computed things, factors, GCDs, primes, but none of them actually classified a number into the type it was.

Then I realized why: schools include these programs in the syllabus to teach students Python and basic mathematical logic, not so students can look up which number is which. The exercise is the point. So a library that just answers "is this Armstrong" defeats the purpose schools have for assigning it in the first place.

That's why why() and the explain functions exist. Instead of just returning True or False, numclassify shows the actual math, the same steps you'd write out by hand. The goal isn't to do the homework for you. It's to be the thing you check your own work against, or use to explore beyond what one assignment asks for.

153   →  Armstrong, Harshad, Triangular, Abundant, ...
1729  →  Taxicab (Hardy-Ramanujan), Carmichael, Harshad, ...
28    →  Perfect, Triangular, Hexagonal, Semiprime, ...

Try it in your browser: numclassify Playground


Installation

pip install numclassify

Python 3.8+ required. No external dependencies.


Quick Start

The standout feature is why() -- it explains the reasoning, not just the result:

import numclassify as nc

# Not just True or False — shows you the actual math
nc.why("armstrong", 153)
# "153 is Armstrong because: 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153"

nc.why("perfect", 28)
# "28 is Perfect because: proper divisors = {1, 2, 4, 7, 14}, sum = 28"

Basic usage

import numclassify as nc

# Boolean checks
nc.is_prime(17)       # True
nc.is_perfect(28)     # True

# Classify a single number
nc.classify(1729)
# {
#   'number': 1729,
#   'score': 22,            # total true properties (incl. figurate)
#   'notable_score': 18,    # score excluding polygonal figurate noise
#   'true_properties': ['Taxicab', 'Carmichael', ...],
#   'categories': {'primes': [...], 'sequences': [...], ...}
# }

# Batch classify
nc.classify_batch([6, 28, 496])

# Find numbers in a range with a given property
nc.find_by_property(start=1, end=1000, Perfect=True)
# [6, 28, 496]

# Stream over large ranges without loading everything into memory
for result in nc.stream(1, 1_000_000, min_score=20):
    print(result)

# Stream only numbers with a specific property
for result in nc.stream(1, 10_000, has_property="prime"):
    print(result)

# All true properties of a number (returns a dict of True properties)
nc.get_true_properties(1729)

# Pretty-print a formatted table
nc.print_properties(153)
# ┌─────────────────────────────────────────┐
# │  Properties of 153                      │
# ├─────────────────────────────────────────┤
# │  armstrong         ✓                    │
# │  harshad           ✓                    │
# │  triangular        ✓                    │
# │  ...                                    │
# └─────────────────────────────────────────┘

CLI

# Classify a number
numclassify check 1729

# JSON output for piping
numclassify check 153 --json

# Find numbers of a type
numclassify find armstrong --limit 10

# Filter a range
numclassify range 1 20 --filter prime

# Compare two numbers
numclassify compare 6 28

# List all types in a category
numclassify list --category primes

# Get info and OEIS reference for a type
numclassify info armstrong

# Explain why a number has a property
numclassify why armstrong 153

# Practice mode: guess before you see the answer
numclassify quiz armstrong --count 10
numclassify quiz --list-types

# Multi-property query with AND/OR/NOT logic
numclassify query 1 1000 --has prime palindrome

Number Categories

Category Count
Polygonal figurate ~1003
Centered polygonal ~998
Prime families 41
Digital invariants 13
Divisor-based 27
Sequences 16
Powers 13
Combinatorial 10
Recreational 6
Total 2141

Custom Types

The @register decorator lets you add your own number types. Once registered, the type appears everywhere -- classify(), find_by_property(), the CLI, all of it.

from numclassify import register

@register(name="my_type", category="custom")
def is_my_type(n: int) -> bool:
    return n > 0 and n % 7 == 0 and str(n)[0] == "4"

import numclassify as nc
nc.is_my_type(42)           # True
nc.get_true_properties(42)  # [..., 'my_type', ...]

See examples/ for runnable scripts covering all major features.


Practice mode

Learn number classification by guessing, not by calling a function.

numclassify quiz armstrong --count 10
numclassify quiz --list-types

Guess YES or NO for each number, then see the actual math (divisors, digit sums, factorizations) before the verdict. Built for ICSE Class 10 Computer Applications topics: Armstrong, Perfect, Prime, Harshad, Circular Prime, Emirp, Fibonacci, Buzz, Spy, Automorphic, Neon, Duck, Disarium, Kaprekar, Happy, Sunny, Strong, Twin Prime, Abundant, Deficient.

Also in the playground under the Practice tab.


API Reference

Function Description
classify(n) Returns {number, score, notable_score, true_properties, categories}
classify_batch(numbers) Classify a list; returns list of dicts
random_number(max_n) Classify a randomly selected number
find_by_property(start, end, **filters) Numbers in range matching property filters
stream(start, end, min_score, has_property) Generator -- memory-safe range classification
get_all_properties(n) Dict of every type mapped to True/False
get_true_properties(n) Dict mapping each True property name to True
print_properties(n) Pretty-print property table to stdout
count_properties(n) Count of True properties
most_special_in_range(lo, hi, verbose) Number in range with the most True properties
find_in_range(fn, lo, hi) Numbers where callable fn returns True
find_any_in_range(predicates, lo, hi) Integers in range satisfying at least one predicate
find_all_in_range(predicates, lo, hi) Integers in range satisfying all predicates
why(property, n) Step-by-step explanation of why n does/doesn't satisfy a property
property_info(name) Registry metadata for a type, with auto-generated examples
find(start, end, has, not_has, any_of) Query a range with multi-property AND/OR/NOT logic
register Decorator to add custom number types
is_prime(n) Convenience boolean
is_armstrong(n) Convenience boolean
is_perfect(n) Convenience boolean

Full docs: aratrikghosh2011-tech.github.io/numclassify


More

License

MIT © 2026 Aratrik Ghosh

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

numclassify-0.8.3.tar.gz (116.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

numclassify-0.8.3-py3-none-any.whl (70.1 kB view details)

Uploaded Python 3

File details

Details for the file numclassify-0.8.3.tar.gz.

File metadata

  • Download URL: numclassify-0.8.3.tar.gz
  • Upload date:
  • Size: 116.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for numclassify-0.8.3.tar.gz
Algorithm Hash digest
SHA256 47a49073152bfab44e50b4e624a3471248c4e5f61a522905397d3e9698f02ed5
MD5 c5fc1076d26f79964698fac4a66645de
BLAKE2b-256 67ad01bd010a3a688f6b2efbdbdcfc44e04f785bd0d2f34a865ad1d1c418b5bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for numclassify-0.8.3.tar.gz:

Publisher: publish.yml on aratrikghosh2011-tech/numclassify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file numclassify-0.8.3-py3-none-any.whl.

File metadata

  • Download URL: numclassify-0.8.3-py3-none-any.whl
  • Upload date:
  • Size: 70.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for numclassify-0.8.3-py3-none-any.whl
Algorithm Hash digest
SHA256 8bae3ec1f897401a60f3a640daab84ac5461cef00d4a72e1eb2719238473d6f9
MD5 96305f6f01e2cb90b22fd40324fe95ca
BLAKE2b-256 b77800f863460ef3eb9c16c183ce04469d4e26008ac27cbb7dd40268fc1241de

See more details on using hashes here.

Provenance

The following attestation bundles were made for numclassify-0.8.3-py3-none-any.whl:

Publisher: publish.yml on aratrikghosh2011-tech/numclassify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page