pchjlib


Namepchjlib JSON
Version 1.7.2 PyPI version JSON
download
home_pageNone
SummaryA Python toolkit for mathematical operations and string processing, including prime numbers, Fibonacci sequences, and Caesar ciphers.
upload_time2025-08-15 00:10:07
maintainerNone
docs_urlNone
authorJoesifer
requires_python>=3.7
licenseNone
keywords pchjlib math education numbers prime numbers fibonacci string processing caesar cipher
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # PCHJLIB - Joesifer

<h1 align="center">
<img src="https://i.imgur.com/AUXxUzd.png" width="500" alt="PCHJLIB - Joesifer">
</h1><br>

[![PyPI Downloads](https://img.shields.io/badge/pchjlib-PyPI_downloads?style=plastic&logo=pchjlib&label=PyPI%20downloads)](https://pypi.org/project/pchjlib/)
[![GitHub](https://img.shields.io/badge/pchjlib-Joesifer_GitHub?style=plastic&logo=GitHub&label=GitHub)](https://github.com/Joesifer/pchjlib)
[![Python](https://img.shields.io/badge/Version_%3E_3.7-1?style=plastic&label=Python)](https://www.python.org/)
[![Owner](https://img.shields.io/badge/Joesifer-1?style=plastic&label=PCHJLIB&labelColor=%2300fff7&color=%23ffe600)](https://github.com/Joesifer)

## πŸ“š Requirements

- **Python**: >= 3.7
- **gmpy2**: Optional for big integer support in features like checking large primes. Install via `pip install gmpy2`.

## πŸ› οΈ Installation

πŸš€ Install the core library without optional dependencies.

πŸ’‘ **Note:** To download the icon (logo) to your `site-packages` folder, run `pchj-icon`. Warning: This modifies folder attributes (sets system/hidden) on Windows only.

### πŸ”§ Option 1: Install from GitHub (development version)

```bash
python -m pip install git+https://github.com/Joesifer/pchjlib.git
```

### πŸ“¦ Option 2: Install from PyPI (stable release)

```bash
python -m pip install pchjlib
```

### πŸ”„ Then run:

```bash
pchj-icon
```

### 🌟 Optional: Enable additional features

To activate big integer support (e.g., for large primes in `is_prime`), install `gmpy2`:

```bash
python -m pip install gmpy2
```

---

## ❓ Basic Usage

πŸ’‘ **Note:** `{function}` can be `is_prime`, `generate_prime_list`, etc. `{___}` can be `primes`, `fibonacci`, `sequence_generation`, etc.

### βœ… Option 1: Import a single function

```bash
from pchjlib.{___} import {function}
result = {function}(value_1, value_2, ...)
```

### βœ… Option 2: Call via the module

```bash
import pchjlib.{___}
result = pchjlib.{___}.{function}(value_1, value_2, ...)
```

---

## 🌟 Key Features

- πŸ” **Special Number Checking and Generation**: Supports prime, emirp, Fibonacci, perfect, narcissistic, amicable, square, strong, twin prime, abundant, and happy numbers.
- πŸ”— **Divisor and Multiple Operations**: Generate divisor lists, compute GCD, LCM, and perform prime factorization.
- 🧹 **List and String Processing**: Remove duplicates, extract digits/numbers/characters, and compress/decompress strings.
- πŸ” **Encryption and Decryption**: Implements Caesar cipher (for educational use only).
- ✨ **Special Calculations**: Includes electricity bill calculation, largest number with a given digit sum, sequence generation, and inversion counting.

## πŸ“š Table of Contents

- πŸ”’ [Prime and Related Number Functions](#-prime-and-related-number-functions-primespy)
- πŸŒ€ [Fibonacci Functions](#-fibonacci-functions-fibonaccipy)
- 🧠 [Perfect, Narcissistic, Amicable, and Happy Number Functions](#-perfect-narcissistic-amicable-and-happy-number-functions-special_numbers1py)
- πŸ“ [Square, Strong, and Friendly Number Functions](#-square-strong-and-friendly-number-functions-special_numbers2py)
- πŸ“Š [Divisor and Multiple Functions](#-divisor-and-multiple-functions-divisors_multiplespy)
- πŸ‘― [Twin Prime and Abundant Number Functions](#-twin-prime-and-abundant-number-functions-twin_abundantpy)
- πŸ” [Prime Factorization Functions](#-prime-factorization-functions-prime_factorizationpy)
- 🧡 [List and String Processing Functions](#-list-and-string-processing-functions-string_processingpy)
- πŸ›οΈ [Caesar Cipher Functions](#%EF%B8%8F-caesar-cipher-functions-caesar_cipherpy)
- πŸ’₯ [Special Calculation Functions](#-special-calculation-functions-special_calculationspy)
- πŸ” [Sequence Generation Functions](#-sequence-generation-functions-sequence_generationpy)
- πŸ”’ [Inversion Counting Functions](#-inversion-counting-functions-inversion_countingpy)
- πŸ“‹ [Sample Command List for the `pchjlib` Library](#-sample-command-list-for-the-pchjlib-library)
- πŸ§ͺ [Running Tests](#-running-tests)
- πŸ› οΈ [Update History](#%EF%B8%8F-update-history)

---

### πŸ”’ Prime and Related Number Functions (primes.py)

> **Note**: `Miller-Rabin` primality test is now deterministic using fixed witnesses for accuracy.

**is_prime(input_number)**
Checks if a number is prime. 
 - Parameter: `input_number` (int)
 - Returns: `True` if prime, `False` otherwise.
 - Raises: InvalidInputError if not an integer.

*Notes:*
 - Negative numbers, 0, and 1 always return False.
 - Uses quick trial division by small primes and perfect square elimination.
 - Falls back on a deterministic `Miller–Rabin` test with bases chosen according to the number’s bit length.
 - If gmpy2 is installed, powmod and isqrt are accelerated.

*Example:*
```python
>>> is_prime(7)
True
>>> is_prime(4)
False
>>> is_prime(-5)
False
```

**generate_prime_list(limit)**
Generates primes from 0 to `limit` using the Sieve algorithm. 
 - Parameter: `limit` (int) 
 - Returns: List of primes. 
 - Raises: `InvalidInputError` if `limit` < 2 or not an integer. 
 - Example: `generate_prime_list(10)` β†’ `[2, 3, 5, 7]`

**is_emirp(input_number)**
Checks if a number is an emirp (prime with prime reverse). 
 - Parameter: `input_number` (int) 
 - Returns: `True` if emirp, `False` otherwise. 
 - Raises: `InvalidInputError` if not a positive integer >= 2. 
 - Example: `is_emirp(13)` β†’ `True`

**generate_emirp_list(limit)**
Generates emirp numbers from 2 to `limit`. 
 - Parameter: `limit` (int) 
 - Returns: List of emirp numbers. 
 - Raises: `InvalidInputError` if `limit` < 2 or not an integer. 
 - Example: `generate_emirp_list(20)` β†’ `[13, 17]`

---

### πŸŒ€ Fibonacci Functions (fibonacci.py)

**fibonacci_at_index(index)**
Calculates the Fibonacci number at a given index with caching. 
 - Parameter: `index` (int) 
 - Returns: Fibonacci number. 
 - Raises: `InvalidInputError` if not a non-negative integer. 
 - Example: `fibonacci_at_index(5)` β†’ `5`

**generate_fibonacci_list(count)**
Generates the first `count` Fibonacci numbers. 
 - Parameter: `count` (int) 
 - Returns: List of Fibonacci numbers. 
 - Raises: `InvalidInputError` if not a non-negative integer. 
 - Example: `generate_fibonacci_list(5)` β†’ `[0, 1, 1, 2, 3]`

---

### 🧠 Perfect, Narcissistic, Amicable, and Happy Number Functions (special_numbers1.py)

**sum_of_divisors(input_number)**
Computes the sum of positive divisors (excluding itself). 
 - Parameter: `input_number` (int) 
 - Returns: Sum of divisors. 
 - Raises: `InvalidInputError` if not a positive integer. 
 - Example: `sum_of_divisors(6)` β†’ `6`

**sum_of_digits(input_number)**
Calculates the sum of a number's digits. 
 - Parameter: `input_number` (int) 
 - Returns: Sum of digits. 
 - Raises: `InvalidInputError` if not an integer. 
 - Example: `sum_of_digits(123)` β†’ `6`

**is_perfect_number(input_number)**
Checks if a number is perfect. 
 - Parameter: `input_number` (int) 
 - Returns: `True` if perfect, `False` otherwise. 
 - Raises: `InvalidInputError` if not a positive integer. 
 - Example: `is_perfect_number(6)` β†’ `True`

**generate_perfect_number_list(limit)**
Generates perfect numbers from 1 to `limit`. 
 - Parameter: `limit` (int) 
 - Returns: List of perfect numbers. 
 - Raises: `InvalidInputError` if not a positive integer. 
 - Example: `generate_perfect_number_list(10)` β†’ `[6]`

**is_narcissistic_number(input_number)**
Checks if a number is narcissistic. 
 - Parameter: `input_number` (int) 
 - Returns: `True` if narcissistic, `False` otherwise. 
 - Raises: `InvalidInputError` if not a non-negative integer. 
 - Example: `is_narcissistic_number(153)` β†’ `True`

**generate_narcissistic_number_list(limit)**
Generates narcissistic numbers from 0 to `limit`. 
 - Parameter: `limit` (int) 
 - Returns: List of narcissistic numbers. 
 - Raises: `InvalidInputError` if not a non-negative integer. 
 - Example: `generate_narcissistic_number_list(10000)` β†’ `[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474]`

**are_amicable_numbers(number1, number2)**
Checks if two numbers are amicable. 
 - Parameters: `number1`, `number2` (int) 
 - Returns: `True` if amicable, `False` otherwise. 
 - Raises: `InvalidInputError` if not positive integers. 
 - Example: `are_amicable_numbers(220, 284)` β†’ `True`

**is_happy_number(input_number)**
Checks if a number is happy. 
 - Parameter: `input_number` (int) 
 - Returns: `True` if happy, `False` otherwise. 
 - Raises: `InvalidInputError` if not a positive integer. 
 - Example: `is_happy_number(19)` β†’ `True`

**generate_happy_number_list(limit)**
Generates happy numbers from 1 to `limit`. 
 - Parameter: `limit` (int) 
 - Returns: List of happy numbers. 
 - Raises: `InvalidInputError` if not a positive integer. 
 - Example: `generate_happy_number_list(10)` β†’ `[1, 7, 10]`

---

### πŸ“ Square, Strong, and Friendly Number Functions (special_numbers2.py)

**is_square_number(input_number)**
Checks if a number is a perfect square. 
 - Parameter: `input_number` (int) 
 - Returns: `True` if square, `False` otherwise. 
 - Raises: `InvalidInputError` if not a non-negative integer. 
 - Example: `is_square_number(16)` β†’ `True`

**generate_square_number_list(limit)**
Generates square numbers from 0 to `limit`. 
 - Parameter: `limit` (int) 
 - Returns: List of square numbers. 
 - Raises: `InvalidInputError` if not a non-negative integer. 
 - Example: `generate_square_number_list(10)` β†’ `[0, 1, 4, 9]`

**are_friendly_numbers(number1, number2)**
Checks if two numbers are friendly. 
 - Parameters: `number1`, `number2` (int) 
 - Returns: `True` if friendly, `False` otherwise. 
 - Raises: `InvalidInputError` if not positive integers. 
 - Example: `are_friendly_numbers(30, 140)` β†’ `True`

**is_strong_number(input_number)**
Checks if a number is strong (sum of factorial of digits equals number). 
 - Parameter: `input_number` (int) 
 - Returns: `True` if strong, `False` otherwise. 
 - Raises: `InvalidInputError` if not a non-negative integer. 
 - Example: `is_strong_number(145)` β†’ `True`

---

### πŸ“Š Divisor and Multiple Functions (divisors_multiples.py)

**sum_of_divisors(input_number)**
Computes the sum of positive divisors (excluding itself). 
 - Parameter: `input_number` (int) 
 - Returns: Sum of divisors. 
 - Raises: `InvalidInputError` if not a positive integer. 
 - Example: `sum_of_divisors(6)` β†’ `6`

**generate_divisor_list(input_number, positive_only=True)**
Generates divisors of a number. 
 - Parameters: `input_number` (int), `positive_only` (bool) 
 - Returns: List of divisors. 
 - Raises: `InvalidInputError` if not an integer or zero. 
 - Example: `generate_divisor_list(6)` β†’ `[1, 2, 3, 6]`

**generate_multiple_list(base_number, limit, positive_only=True)**
Generates multiples of a number up to `limit` times. 
 - Parameters: `base_number` (int), `limit` (int), `positive_only` (bool) 
 - Returns: List of multiples. 
 - Raises: `InvalidInputError` if not integers, number is zero, or limit < 1. 
 - Example: `generate_multiple_list(3, 5)` β†’ `[3, 6, 9, 12, 15]`

**common_divisors(numbers)**
Generates common divisors for a list of numbers. 
 - Parameter: `numbers` (list) 
 - Returns: List of common divisors. 
 - Raises: `InvalidInputError` if not a list or contains non-integers; `MathError` if fewer than 2 non-zero elements. 
 - Example: `common_divisors([12, 18])` β†’ `[1, 2, 3, 6]`

**greatest_common_divisor(numbers)**
Computes the GCD of a list of numbers. 
 - Parameter: `numbers` (list) 
 - Returns: GCD value. 
 - Raises: `InvalidInputError` if not a list or contains non-integers; `MathError` if fewer than 2 non-zero elements. 
 - Example: `greatest_common_divisor([12, 18])` β†’ `6`

**least_common_multiple(numbers)**
Computes the LCM of a list of numbers. 
 - Parameter: `numbers` (list) 
 - Returns: LCM value. 
 - Raises: `InvalidInputError` if not a list, contains non-integers, or zeros; `MathError` if fewer than 2 elements. 
 - Example: `least_common_multiple([4, 6])` β†’ `12`

---

### πŸ‘― Twin Prime and Abundant Number Functions (twin_abundant.py)

**is_twin_prime(input_number)**
Checks if a number is a twin prime. 
 - Parameter: `input_number` (int) 
 - Returns: `True` if twin prime, `False` otherwise. 
 - Raises: `InvalidInputError` if not an integer. 
 - Example: `is_twin_prime(5)` β†’ `True`

**generate_twin_prime_list(limit)**
Generates twin primes from 2 to `limit`. 
 - Parameter: `limit` (int) 
 - Returns: List of twin primes. 
 - Raises: `InvalidInputError` if not an integer >= 2. 
 - Example: `generate_twin_prime_list(20)` β†’ `[3, 5, 7, 11, 13, 17, 19]`

**is_abundant_number(input_number)**
Checks if a number is abundant. 
 - Parameter: `input_number` (int) 
 - Returns: `True` if abundant, `False` otherwise. 
 - Raises: `InvalidInputError` if not a positive integer. 
 - Example: `is_abundant_number(12)` β†’ `True`

**generate_abundant_number_list(limit)**
Generates abundant numbers from 1 to `limit`. 
 - Parameter: `limit` (int) 
 - Returns: List of abundant numbers. 
 - Raises: `InvalidInputError` if not a positive integer. 
 - Example: `generate_abundant_number_list(20)` β†’ `[12, 18, 20]`

---

### πŸ” Prime Factorization Functions (prime_factorization.py)

**prime_factors(input_number)**
Factorizes a number into prime factors. 
 - Parameter: `input_number` (int) 
 - Returns: List of prime factors. 
 - Raises: `InvalidInputError` if not a positive integer > 1. 
 - Example: `prime_factors(12)` β†’ `[2, 2, 3]`

**greatest_common_prime_divisor(number1, number2)**
Finds the greatest common prime divisor of two numbers. 
 - Parameters: `number1`, `number2` (int) 
 - Returns: Greatest common prime divisor. 
 - Raises: `InvalidInputError` if not positive integers > 1; `MathError` if no common prime divisor. 
 - Example: `greatest_common_prime_divisor(12, 18)` β†’ `3`

---

### 🧡 List and String Processing Functions (string_processing.py)

**remove_duplicates(items)**
Removes duplicates from a list and sorts in descending order. 
 - Parameter: `items` (list) 
 - Returns: Sorted list without duplicates. 
 - Raises: `InvalidInputError` if not a list/tuple. 
 - Example: `remove_duplicates([1, 2, 2, 3])` β†’ `[3, 2, 1]`

**extract_digits_from_string(text)**
Extracts individual digits from a string. 
 - Parameter: `text` (str) 
 - Returns: List of digits. 
 - Example: `extract_digits_from_string("abc123")` β†’ `[1, 2, 3]`

**extract_numbers_from_string(text)**
Extracts full numbers from a string. 
 - Parameter: `text` (str) 
 - Returns: List of numbers. 
 - Example: `extract_numbers_from_string("abc123def456")` β†’ `[123, 456]`

**extract_characters(text)**
Extracts non-digit characters from a string. 
 - Parameter: `text` (str) 
 - Returns: List of characters. 
 - Example: `extract_characters("a1b2c3")` β†’ `['a', 'b', 'c']`

**compress_string(text, compress_type)**
Compresses a string using two methods. 
 - Parameters: `text` (str), `compress_type` (int) 
 - Returns: Compressed string. 
 - Example (type 1): `compress_string("google", 1)` β†’ `'e2gl2o'` 
 - Example (type 2): `compress_string("google", 2)` β†’ `'g2ogle'`

**compress_string_without_numbers(input_text)**
Compresses a string by removing consecutive duplicates. 
 - Parameter: `input_text` (str) 
 - Returns: Compressed string. 
 - Example: `compress_string_without_numbers("hhhoocssssiiinnnhhhhh")` β†’ `'hocsinh'`

**decompress_string(text)**
Decompresses a string with numeric counts. 
 - Parameter: `text` (str) 
 - Returns: Decompressed string. 
 - Example: `decompress_string("g2ogle")` β†’ `"google"`

**unique_characters_string(text)**
Creates a string with unique characters in order of appearance. 
 - Parameter: `text` (str) 
 - Returns: String with no duplicates. 
 - Example: `unique_characters_string("google")` β†’ `"gole"`

---

### πŸ›οΈ Caesar Cipher Functions (caesar_cipher.py)

**caesar_cipher_to_numbers(text, shift)**
Converts a string to a list of Caesar cipher numbers. 
 - Parameters: `text` (str), `shift` (int) 
 - Returns: List of shifted numbers. 
 - Example: `caesar_cipher_to_numbers("ABC", 3)` β†’ `[3, 4, 5]`

**caesar_cipher_from_numbers(numbers, shift)**
Decodes a list of Caesar cipher numbers into a string. 
 - Parameters: `numbers` (list), `shift` (int) 
 - Returns: Decoded string. 
 - Example: `caesar_cipher_from_numbers([3, 4, 5], 3)` β†’ `"ABC"`

---

### πŸ’₯ Special Calculation Functions (special_calculations.py)

**calculate_electricity_bill_vietnam(old_reading, new_reading)**
Calculates an electricity bill based on Vietnamese pricing tiers. 
 - Parameters: `old_reading`, `new_reading` (float) 
 - Returns: String with consumption and cost. 
 - Example: `calculate_electricity_bill_vietnam(100, 150)` β†’ `"- Electricity consumed this month: 50.0 Kwh\n- Electricity bill this month: 83900.0 VND"`

**largest_number_with_digit_sum(digit_count, target_sum)**
Finds the largest number with `digit_count` digits summing to `target_sum`. 
 - Parameters: `digit_count` (int), `target_sum` (int) 
 - Returns: Largest number as a string. 
 - Example: `largest_number_with_digit_sum(3, 15)` β†’ `'960'`

---

### πŸ” Sequence Generation Functions (sequence_generation.py)

**generate_sequence_rule_1(count)**
Generate a sequence according to the rule: 1 divisible by 1, 2 by 2, etc. 
 - Parameter: `count` (int) 
 - Returns: List of sequence numbers. 
 - Example: `generate_sequence_rule_1(10)` β†’ `[1, 4, 6, 9, 12, 15, 16, 20, 24, 28]`

**generate_sequence_rule_2(base, count)**
Generates `count` multiples of `base`. 
 - Parameters: `base` (int), `count` (int) 
 - Returns: List of multiples. 
 - Example: `generate_sequence_rule_2(2, 5)` β†’ `[2, 4, 6, 8, 10]`

**generate_sequence_rule_3(count, base)**
Generates powers of `base` from 1 to `count`. 
 - Parameters: `count` (int), `base` (int) 
 - Returns: List of powers. 
 - Example: `generate_sequence_rule_3(5, 2)` β†’ `[2, 4, 8, 16, 32]`

---

### πŸ”’ Inversion Counting Functions (inversion_counting.py)

**count_inversions(numbers)**
Counts the number of inversions in a list. 
 - Parameter: `numbers` (list) 
 - Returns: Number of inversions. 
 - Example: `count_inversions([1, 3, 2])` β†’ `1`

---

## πŸ“‹ Sample Command List for the `pchjlib` Library

## 1. Primes and Emirps

- **Check if a number is prime:**
`python pchjmain.py primes_and_emirps --is_prime <number>` 
 _Example:_ `python pchjmain.py primes_and_emirps --is_prime 17`

- **Generate a list of primes:**
`python pchjmain.py primes_and_emirps --generate_prime_list <limit>` 
 _Example:_ `python pchjmain.py primes_and_emirps --generate_prime_list 50`

- **Check if a number is an emirp:**
`python pchjmain.py primes_and_emirps --is_emirp <number>` 
 _Example:_ `python pchjmain.py primes_and_emirps --is_emirp 13`

- **Generate a list of emirps:**
`python pchjmain.py primes_and_emirps --generate_emirp_list <limit>` 
 _Example:_ `python pchjmain.py primes_and_emirps --generate_emirp_list 100`

## 2. Twin Primes and Abundant Numbers

- **Check if a number is a twin prime:**
`python pchjmain.py twin_primes_and_abundant --is_twin_prime <number>` 
 _Example:_ `python pchjmain.py twin_primes_and_abundant --is_twin_prime 5`

- **Generate a list of twin primes:**
`python pchjmain.py twin_primes_and_abundant --generate_twin_prime_list <limit>` 
 _Example:_ `python pchjmain.py twin_primes_and_abundant --generate_twin_prime_list 50`

- **Check if a number is abundant:**
`python pchjmain.py twin_primes_and_abundant --is_abundant <number>` 
 _Example:_ `python pchjmain.py twin_primes_and_abundant --is_abundant 12`

- **Generate a list of abundant numbers:**
`python pchjmain.py twin_primes_and_abundant --generate_abundant_list <limit>` 
 _Example:_ `python pchjmain.py twin_primes_and_abundant --generate_abundant_list 100`

## 3. Fibonacci Sequence

- **Compute the Fibonacci number at a given index:**
`python pchjmain.py fibonacci --at_index <index>` 
 _Example:_ `python pchjmain.py fibonacci --at_index 10`

- **Generate a list of Fibonacci numbers:**
`python pchjmain.py fibonacci --generate_list <count>` 
 _Example:_ `python pchjmain.py fibonacci --generate_list 5`

## 4. Special Numbers 1 (Perfect, Narcissistic, Amicable, Happy)

- **Check if a number is perfect:**
`python pchjmain.py special_numbers_1 --is_perfect <number>` 
 _Example:_ `python pchjmain.py special_numbers_1 --is_perfect 28`

- **Generate a list of perfect numbers:**
`python pchjmain.py special_numbers_1 --generate_perfect_list <limit>` 
 _Example:_ `python pchjmain.py special_numbers_1 --generate_perfect_list 1000`

- **Check if a number is narcissistic:**
`python pchjmain.py special_numbers_1 --is_narcissistic <number>` 
 _Example:_ `python pchjmain.py special_numbers_1 --is_narcissistic 153`

- **Generate a list of narcissistic numbers:**
`python pchjmain.py special_numbers_1 --generate_narcissistic_list <limit>` 
 _Example:_ `python pchjmain.py special_numbers_1 --generate_narcissistic_list 1000`

- **Check if two numbers are amicable:**
`python pchjmain.py special_numbers_1 --are_amicable <number1> <number2>` 
 _Example:_ `python pchjmain.py special_numbers_1 --are_amicable 220 284`

- **Check if a number is happy:**
`python pchjmain.py special_numbers_1 --is_happy <number>` 
 _Example:_ `python pchjmain.py special_numbers_1 --is_happy 19`

- **Generate a list of happy numbers:**
`python pchjmain.py special_numbers_1 --generate_happy_list <limit>` 
 _Example:_ `python pchjmain.py special_numbers_1 --generate_happy_list 100`

## 5. Special Numbers 2 (Square, Strong, Friendly)

- **Check if a number is a perfect square:**
`python pchjmain.py special_numbers_2 --is_square <number>` 
 _Example:_ `python pchjmain.py special_numbers_2 --is_square 16`

- **Generate a list of perfect squares:**
`python pchjmain.py special_numbers_2 --generate_square_list <limit>` 
 _Example:_ `python pchjmain.py special_numbers_2 --generate_square_list 100`

- **Check if a number is strong:**
`python pchjmain.py special_numbers_2 --is_strong <number>` 
 _Example:_ `python pchjmain.py special_numbers_2 --is_strong 145`

- **Check if two numbers are friendly:**
`python pchjmain.py special_numbers_2 --are_friendly <number1> <number2>` 
 _Example:_ `python pchjmain.py special_numbers_2 --are_friendly 30 140`

## 6. Divisors and Multiples

- **Generate a list of divisors:**
`python pchjmain.py divisors_and_multiples --generate_divisor_list <number>` 
 _Example:_ `python pchjmain.py divisors_and_multiples --generate_divisor_list 28`

- **Generate a list of multiples:**
`python pchjmain.py divisors_and_multiples --generate_multiple_list <number> <limit>` 
 _Example:_ `python pchjmain.py divisors_and_multiples --generate_multiple_list 3 20`

- **Find common divisors:**
`python pchjmain.py divisors_and_multiples --common_divisors <number1> <number2> [<number3> ...]` 
 _Example:_ `python pchjmain.py divisors_and_multiples --common_divisors 12 18 24`

- **Compute GCD (Greatest Common Divisor):**
`python pchjmain.py divisors_and_multiples --gcd <number1> <number2> [<number3> ...]` 
 _Example:_ `python pchjmain.py divisors_and_multiples --gcd 12 18 24`

- **Compute LCM (Least Common Multiple):**
`python pchjmain.py divisors_and_multiples --lcm <number1> <number2> [<number3> ...]` 
 _Example:_ `python pchjmain.py divisors_and_multiples --lcm 4 5 6`

## 7. Prime Factorization

- **Prime factorization:**
`python pchjmain.py prime_factorization --prime_factors <number>` 
 _Example:_ `python pchjmain.py prime_factorization --prime_factors 100`

- **Greatest common prime divisor:**
`python pchjmain.py prime_factorization --greatest_common_prime_divisor <number1> <number2>` 
 _Example:_ `python pchjmain.py prime_factorization --greatest_common_prime_divisor 12 18`

## 8. String Processing

- **Remove duplicate elements:**
`python pchjmain.py string_processing --remove_duplicates <elem1> <elem2> ...` 
 _Example:_ `python pchjmain.py string_processing --remove_duplicates 1 2 2 3 4 4`

- **Extract digits:**
`python pchjmain.py string_processing --extract_digits "<string>"` 
 _Example:_ `python pchjmain.py string_processing --extract_digits "a1b2c3"`

- **Extract numbers:**
`python pchjmain.py string_processing --extract_numbers "<string>"` 
 _Example:_ `python pchjmain.py string_processing --extract_numbers "a12b34c56"`

- **Extract non-digit characters:**
`python pchjmain.py string_processing --extract_characters "<string>"` 
 _Example:_ `python pchjmain.py string_processing --extract_characters "a1b2c3"`

- **Compress a string (type 1 or 2):**
`python pchjmain.py string_processing --compress "<string>" <compress_type>` 
 _Example:_ `python pchjmain.py string_processing --compress "aaabbbcc" 1`

- **Compress a string without counts:**
`python pchjmain.py string_processing --compress_without_numbers "<string>"` 
 _Example:_ `python pchjmain.py string_processing --compress_without_numbers "aaabbbcc"`

- **Decompress a string:**
`python pchjmain.py string_processing --decompress "<compressed_string>"` 
 _Example:_ `python pchjmain.py string_processing --decompress "a3b2c1"`

- **Get unique characters in a string:**
`python pchjmain.py string_processing --unique_characters "<string>"` 
 _Example:_ `python pchjmain.py string_processing --unique_characters "aaabbbcc"`

## 9. Caesar Cipher

- **Convert text to Caesar numbers:**
`python pchjmain.py caesar_cipher --to_numbers "<text>" <shift>` 
 _Example:_ `python pchjmain.py caesar_cipher --to_numbers "abc" 3`

- **Convert Caesar numbers back to text:**
`python pchjmain.py caesar_cipher --from_numbers <shift> <num1> <num2> ...` 
 _Example:_ `python pchjmain.py caesar_cipher --from_numbers 3 4 5 6`

## 10. Special Calculations

- **Calculate an electricity bill:**
`python pchjmain.py special_calculations --electricity_bill <old_reading> <new_reading>` 
 _Example:_ `python pchjmain.py special_calculations --electricity_bill 100 200`

- **Find the largest number with given digits sum:**
`python pchjmain.py special_calculations --largest_number <digit_count> <digit_sum>` 
 _Example:_ `python pchjmain.py special_calculations --largest_number 3 15`

## 11. Sequence Generation

- **Generate sequence by rule 1:**
`python pchjmain.py sequence_generation --rule1 <count>` 
 _Example:_ `python pchjmain.py sequence_generation --rule1 5`

- **Generate sequence by rule 2:**
`python pchjmain.py sequence_generation --rule2 <base> <count>` 
 _Example:_ `python pchjmain.py sequence_generation --rule2 2 5`

- **Generate sequence by rule 3:**
`python pchjmain.py sequence_generation --rule3 <count> <base>` 
 _Example:_ `python pchjmain.py sequence_generation --rule3 5 2`

## 12. Inversion Counting

- **Count inversions in a list:**
`python pchjmain.py inversion_counting --count <elem1> <elem2> ...` 
 _Example:_ `python pchjmain.py inversion_counting --count 2 3 1 4`

---

### Note

- Replace `<...>` with actual values when running the command. 
- Ensure commands are executed in the directory containing `pchjmain.py`. 
- For detailed help on any category, run `python pchjmain.py <category> -h` (e.g., `python pchjmain.py primes_and_emirps -h`).

---

## πŸ§ͺ Running Tests

To run the unit tests for the library, navigate to the project root and execute:

```bash
python -m unittest discover tests
```

This will discover and run all tests in the `tests/` directory. Ensure the library is installed in editable mode (`pip install -e .`) for proper import resolution.

---

## πŸ› οΈ Update History

**πŸ“… Latest Update:** August 15, 2025
**πŸ“¦ Total Releases:** 99

### πŸ“Œ 2025
#### 1.7.2 β†’ 1.7.1 (August 15, 2025)
- Optimize the `is_prime` function.

#### 1.7.0 (August 12, 2025)
- **Performance Improvements**: Implemented merge sort for O(n log n) inversion counting; added Pollard's Rho for faster prime factorization on large numbers; made sequence generation dynamic to handle larger counts; integrated optional gmpy2 for accelerated GCD/LCM.
- **Code Quality Enhancements**: Standardized function names (e.g., `calculate_electricity_bill_Vietnamese` to `calculate_electricity_bill_vietnam`); replaced wildcard imports with explicit ones in `__init__.py`; fixed bug in `largest_number_with_digit_sum` for correct largest output (e.g., '960' for 3 digits sum 15); improved CLI error handling with detailed tracebacks; added user warning for side-effects in `pchjicon.py`; made `Miller-Rabin` primality test deterministic using fixed witnesses.
- **Documentation Updates**: Fixed incorrect examples in README (e.g., largest number); summarized update history for brevity; removed redundant sections and added warnings for probabilistic methods (now deterministic) and side-effects.

#### 1.6.5 β†’ 1.5.0 (August 11-12, 2025)
- Fixed minor bugs and optimized `generate_sequence_rule_3`/`generate_sequence_rule_2`.
- Updated `is_strong_number` to standard factorion definition.
- Removed `solve_equation` and its CLI category.
- Eliminated `numpy` dependency; added optional gmpy2 integration.
- Added type hints, examples, and performance optimizations (e.g., iterative Fibonacci).

#### 1.4.5 β†’ 1.3.0 (August 7-8, 2025)
- Fixed minor bugs.

#### 1.2.3 β†’ 1.0.1 (August 4–5, 2025)
- Removed unused functions; added logo support via `pchj-icon`.
- Added Sample Command List; enhanced CLI.

#### 1.0.0 β†’ 0.1.5.1 (August 3-4, 2025)
- Major overhaul: Optimizations, error handling, documentation, and tests.
- Removed legacy dependencies and functions; switched README to English.

#### 0.1.5 β†’ 0.1.4 (August 2, 2025)
- Removed Roman numeral conversion; fixed matrix program.
- Added negative divisors/multiples; merged string compression.

#### 0.1.3.2 β†’ 0.1.2 (August 1, 2025)
- Minor fixes; consolidated strong-number logic; optimized Fibonacci/primes.

#### 0.1.1.3 β†’ 0.1.0.7 (July 31, 2025)
- README updates; dependency fixes.

#### 0.1.0.6 β†’ 0.1.0.3 (July 28–30, 2025)
- Bug fixes.

#### 0.1.0.2 β†’ 0.1.0 (July 28, 2025)
- Minor fixes; removed legacy functions; code overhaul.

#### 0.0.5.2.1 β†’ 0.0.5.0 (July 26-27, 2025)
- README tweaks; updated teen code.

### πŸ“Œ 2024
- **0.0.4.1 (October 17, 2024)**: Added sequence creation; updated one-two-three.
- **0.0.4.0 β†’ 0.0.3.5 (May 3–5, 2024)**: README fixes; updated Christmas tree variants; testing.
- **0.0.3.4 (February 26, 2024)**: Added common divisors list.
- **0.0.3.3 β†’ 0.0.3 (February 20–21, 2024)**: README enhancements; added abundant check and unique string; removed duplicates check.
- **0.0.2.10 β†’ 0.0.2.6 (February 18–19, 2024)**: README updates; testing; switched to MIT License.
- **0.0.2.5 β†’ 0.0.2.1 (February 14–18, 2024)**: README and tests.
- **0.0.2 β†’ 0.0.0.1 (February 14, 2024)**: Dependency fixes; testing; initial release.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pchjlib",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "pchjlib, math, education, numbers, prime numbers, fibonacci, string processing, caesar cipher",
    "author": "Joesifer",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/3c/e6/9d90ab34705e5321dbef2da16456ec5774180a1a9ff1ba0854ca80de1229/pchjlib-1.7.2.tar.gz",
    "platform": null,
    "description": "# PCHJLIB - Joesifer\r\n\r\n<h1 align=\"center\">\r\n<img src=\"https://i.imgur.com/AUXxUzd.png\" width=\"500\" alt=\"PCHJLIB - Joesifer\">\r\n</h1><br>\r\n\r\n[![PyPI Downloads](https://img.shields.io/badge/pchjlib-PyPI_downloads?style=plastic&logo=pchjlib&label=PyPI%20downloads)](https://pypi.org/project/pchjlib/)\r\n[![GitHub](https://img.shields.io/badge/pchjlib-Joesifer_GitHub?style=plastic&logo=GitHub&label=GitHub)](https://github.com/Joesifer/pchjlib)\r\n[![Python](https://img.shields.io/badge/Version_%3E_3.7-1?style=plastic&label=Python)](https://www.python.org/)\r\n[![Owner](https://img.shields.io/badge/Joesifer-1?style=plastic&label=PCHJLIB&labelColor=%2300fff7&color=%23ffe600)](https://github.com/Joesifer)\r\n\r\n## \ud83d\udcda Requirements\r\n\r\n- **Python**: >= 3.7\r\n- **gmpy2**: Optional for big integer support in features like checking large primes. Install via `pip install gmpy2`.\r\n\r\n## \ud83d\udee0\ufe0f Installation\r\n\r\n\ud83d\ude80 Install the core library without optional dependencies.\r\n\r\n\ud83d\udca1 **Note:** To download the icon (logo) to your `site-packages` folder, run `pchj-icon`. Warning: This modifies folder attributes (sets system/hidden) on Windows only.\r\n\r\n### \ud83d\udd27 Option 1: Install from GitHub (development version)\r\n\r\n```bash\r\npython -m pip install git+https://github.com/Joesifer/pchjlib.git\r\n```\r\n\r\n### \ud83d\udce6 Option 2: Install from PyPI (stable release)\r\n\r\n```bash\r\npython -m pip install pchjlib\r\n```\r\n\r\n### \ud83d\udd04 Then run:\r\n\r\n```bash\r\npchj-icon\r\n```\r\n\r\n### \ud83c\udf1f Optional: Enable additional features\r\n\r\nTo activate big integer support (e.g., for large primes in `is_prime`), install `gmpy2`:\r\n\r\n```bash\r\npython -m pip install gmpy2\r\n```\r\n\r\n---\r\n\r\n## \u2753 Basic Usage\r\n\r\n\ud83d\udca1 **Note:** `{function}` can be `is_prime`, `generate_prime_list`, etc. `{___}` can be `primes`, `fibonacci`, `sequence_generation`, etc.\r\n\r\n### \u2705 Option 1: Import a single function\r\n\r\n```bash\r\nfrom pchjlib.{___} import {function}\r\nresult = {function}(value_1, value_2, ...)\r\n```\r\n\r\n### \u2705 Option 2: Call via the module\r\n\r\n```bash\r\nimport pchjlib.{___}\r\nresult = pchjlib.{___}.{function}(value_1, value_2, ...)\r\n```\r\n\r\n---\r\n\r\n## \ud83c\udf1f Key Features\r\n\r\n- \ud83d\udd0d **Special Number Checking and Generation**: Supports prime, emirp, Fibonacci, perfect, narcissistic, amicable, square, strong, twin prime, abundant, and happy numbers.\r\n- \ud83d\udd17 **Divisor and Multiple Operations**: Generate divisor lists, compute GCD, LCM, and perform prime factorization.\r\n- \ud83e\uddf9 **List and String Processing**: Remove duplicates, extract digits/numbers/characters, and compress/decompress strings.\r\n- \ud83d\udd10 **Encryption and Decryption**: Implements Caesar cipher (for educational use only).\r\n- \u2728 **Special Calculations**: Includes electricity bill calculation, largest number with a given digit sum, sequence generation, and inversion counting.\r\n\r\n## \ud83d\udcda Table of Contents\r\n\r\n- \ud83d\udd22 [Prime and Related Number Functions](#-prime-and-related-number-functions-primespy)\r\n- \ud83c\udf00 [Fibonacci Functions](#-fibonacci-functions-fibonaccipy)\r\n- \ud83e\udde0 [Perfect, Narcissistic, Amicable, and Happy Number Functions](#-perfect-narcissistic-amicable-and-happy-number-functions-special_numbers1py)\r\n- \ud83d\udcd0 [Square, Strong, and Friendly Number Functions](#-square-strong-and-friendly-number-functions-special_numbers2py)\r\n- \ud83d\udcca [Divisor and Multiple Functions](#-divisor-and-multiple-functions-divisors_multiplespy)\r\n- \ud83d\udc6f [Twin Prime and Abundant Number Functions](#-twin-prime-and-abundant-number-functions-twin_abundantpy)\r\n- \ud83d\udd0d [Prime Factorization Functions](#-prime-factorization-functions-prime_factorizationpy)\r\n- \ud83e\uddf5 [List and String Processing Functions](#-list-and-string-processing-functions-string_processingpy)\r\n- \ud83c\udfdb\ufe0f [Caesar Cipher Functions](#%EF%B8%8F-caesar-cipher-functions-caesar_cipherpy)\r\n- \ud83d\udca5 [Special Calculation Functions](#-special-calculation-functions-special_calculationspy)\r\n- \ud83d\udd01 [Sequence Generation Functions](#-sequence-generation-functions-sequence_generationpy)\r\n- \ud83d\udd22 [Inversion Counting Functions](#-inversion-counting-functions-inversion_countingpy)\r\n- \ud83d\udccb [Sample Command List for the `pchjlib` Library](#-sample-command-list-for-the-pchjlib-library)\r\n- \ud83e\uddea [Running Tests](#-running-tests)\r\n- \ud83d\udee0\ufe0f [Update History](#%EF%B8%8F-update-history)\r\n\r\n---\r\n\r\n### \ud83d\udd22 Prime and Related Number Functions (primes.py)\r\n\r\n> **Note**: `Miller-Rabin` primality test is now deterministic using fixed witnesses for accuracy.\r\n\r\n**is_prime(input_number)**\r\nChecks if a number is prime. \r\n - Parameter: `input_number` (int)\r\n - Returns: `True` if prime, `False` otherwise.\r\n - Raises: InvalidInputError if not an integer.\r\n\r\n*Notes:*\r\n - Negative numbers, 0, and 1 always return False.\r\n - Uses quick trial division by small primes and perfect square elimination.\r\n - Falls back on a deterministic `Miller\u2013Rabin` test with bases chosen according to the number\u2019s bit length.\r\n - If gmpy2 is installed, powmod and isqrt are accelerated.\r\n\r\n*Example:*\r\n```python\r\n>>> is_prime(7)\r\nTrue\r\n>>> is_prime(4)\r\nFalse\r\n>>> is_prime(-5)\r\nFalse\r\n```\r\n\r\n**generate_prime_list(limit)**\r\nGenerates primes from 0 to `limit` using the Sieve algorithm. \r\n - Parameter: `limit` (int) \r\n - Returns: List of primes. \r\n - Raises: `InvalidInputError` if `limit` < 2 or not an integer. \r\n - Example: `generate_prime_list(10)` \u2192 `[2, 3, 5, 7]`\r\n\r\n**is_emirp(input_number)**\r\nChecks if a number is an emirp (prime with prime reverse). \r\n - Parameter: `input_number` (int) \r\n - Returns: `True` if emirp, `False` otherwise. \r\n - Raises: `InvalidInputError` if not a positive integer >= 2. \r\n - Example: `is_emirp(13)` \u2192 `True`\r\n\r\n**generate_emirp_list(limit)**\r\nGenerates emirp numbers from 2 to `limit`. \r\n - Parameter: `limit` (int) \r\n - Returns: List of emirp numbers. \r\n - Raises: `InvalidInputError` if `limit` < 2 or not an integer. \r\n - Example: `generate_emirp_list(20)` \u2192 `[13, 17]`\r\n\r\n---\r\n\r\n### \ud83c\udf00 Fibonacci Functions (fibonacci.py)\r\n\r\n**fibonacci_at_index(index)**\r\nCalculates the Fibonacci number at a given index with caching. \r\n - Parameter: `index` (int) \r\n - Returns: Fibonacci number. \r\n - Raises: `InvalidInputError` if not a non-negative integer. \r\n - Example: `fibonacci_at_index(5)` \u2192 `5`\r\n\r\n**generate_fibonacci_list(count)**\r\nGenerates the first `count` Fibonacci numbers. \r\n - Parameter: `count` (int) \r\n - Returns: List of Fibonacci numbers. \r\n - Raises: `InvalidInputError` if not a non-negative integer. \r\n - Example: `generate_fibonacci_list(5)` \u2192 `[0, 1, 1, 2, 3]`\r\n\r\n---\r\n\r\n### \ud83e\udde0 Perfect, Narcissistic, Amicable, and Happy Number Functions (special_numbers1.py)\r\n\r\n**sum_of_divisors(input_number)**\r\nComputes the sum of positive divisors (excluding itself). \r\n - Parameter: `input_number` (int) \r\n - Returns: Sum of divisors. \r\n - Raises: `InvalidInputError` if not a positive integer. \r\n - Example: `sum_of_divisors(6)` \u2192 `6`\r\n\r\n**sum_of_digits(input_number)**\r\nCalculates the sum of a number's digits. \r\n - Parameter: `input_number` (int) \r\n - Returns: Sum of digits. \r\n - Raises: `InvalidInputError` if not an integer. \r\n - Example: `sum_of_digits(123)` \u2192 `6`\r\n\r\n**is_perfect_number(input_number)**\r\nChecks if a number is perfect. \r\n - Parameter: `input_number` (int) \r\n - Returns: `True` if perfect, `False` otherwise. \r\n - Raises: `InvalidInputError` if not a positive integer. \r\n - Example: `is_perfect_number(6)` \u2192 `True`\r\n\r\n**generate_perfect_number_list(limit)**\r\nGenerates perfect numbers from 1 to `limit`. \r\n - Parameter: `limit` (int) \r\n - Returns: List of perfect numbers. \r\n - Raises: `InvalidInputError` if not a positive integer. \r\n - Example: `generate_perfect_number_list(10)` \u2192 `[6]`\r\n\r\n**is_narcissistic_number(input_number)**\r\nChecks if a number is narcissistic. \r\n - Parameter: `input_number` (int) \r\n - Returns: `True` if narcissistic, `False` otherwise. \r\n - Raises: `InvalidInputError` if not a non-negative integer. \r\n - Example: `is_narcissistic_number(153)` \u2192 `True`\r\n\r\n**generate_narcissistic_number_list(limit)**\r\nGenerates narcissistic numbers from 0 to `limit`. \r\n - Parameter: `limit` (int) \r\n - Returns: List of narcissistic numbers. \r\n - Raises: `InvalidInputError` if not a non-negative integer. \r\n - Example: `generate_narcissistic_number_list(10000)` \u2192 `[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474]`\r\n\r\n**are_amicable_numbers(number1, number2)**\r\nChecks if two numbers are amicable. \r\n - Parameters: `number1`, `number2` (int) \r\n - Returns: `True` if amicable, `False` otherwise. \r\n - Raises: `InvalidInputError` if not positive integers. \r\n - Example: `are_amicable_numbers(220, 284)` \u2192 `True`\r\n\r\n**is_happy_number(input_number)**\r\nChecks if a number is happy. \r\n - Parameter: `input_number` (int) \r\n - Returns: `True` if happy, `False` otherwise. \r\n - Raises: `InvalidInputError` if not a positive integer. \r\n - Example: `is_happy_number(19)` \u2192 `True`\r\n\r\n**generate_happy_number_list(limit)**\r\nGenerates happy numbers from 1 to `limit`. \r\n - Parameter: `limit` (int) \r\n - Returns: List of happy numbers. \r\n - Raises: `InvalidInputError` if not a positive integer. \r\n - Example: `generate_happy_number_list(10)` \u2192 `[1, 7, 10]`\r\n\r\n---\r\n\r\n### \ud83d\udcd0 Square, Strong, and Friendly Number Functions (special_numbers2.py)\r\n\r\n**is_square_number(input_number)**\r\nChecks if a number is a perfect square. \r\n - Parameter: `input_number` (int) \r\n - Returns: `True` if square, `False` otherwise. \r\n - Raises: `InvalidInputError` if not a non-negative integer. \r\n - Example: `is_square_number(16)` \u2192 `True`\r\n\r\n**generate_square_number_list(limit)**\r\nGenerates square numbers from 0 to `limit`. \r\n - Parameter: `limit` (int) \r\n - Returns: List of square numbers. \r\n - Raises: `InvalidInputError` if not a non-negative integer. \r\n - Example: `generate_square_number_list(10)` \u2192 `[0, 1, 4, 9]`\r\n\r\n**are_friendly_numbers(number1, number2)**\r\nChecks if two numbers are friendly. \r\n - Parameters: `number1`, `number2` (int) \r\n - Returns: `True` if friendly, `False` otherwise. \r\n - Raises: `InvalidInputError` if not positive integers. \r\n - Example: `are_friendly_numbers(30, 140)` \u2192 `True`\r\n\r\n**is_strong_number(input_number)**\r\nChecks if a number is strong (sum of factorial of digits equals number). \r\n - Parameter: `input_number` (int) \r\n - Returns: `True` if strong, `False` otherwise. \r\n - Raises: `InvalidInputError` if not a non-negative integer. \r\n - Example: `is_strong_number(145)` \u2192 `True`\r\n\r\n---\r\n\r\n### \ud83d\udcca Divisor and Multiple Functions (divisors_multiples.py)\r\n\r\n**sum_of_divisors(input_number)**\r\nComputes the sum of positive divisors (excluding itself). \r\n - Parameter: `input_number` (int) \r\n - Returns: Sum of divisors. \r\n - Raises: `InvalidInputError` if not a positive integer. \r\n - Example: `sum_of_divisors(6)` \u2192 `6`\r\n\r\n**generate_divisor_list(input_number, positive_only=True)**\r\nGenerates divisors of a number. \r\n - Parameters: `input_number` (int), `positive_only` (bool) \r\n - Returns: List of divisors. \r\n - Raises: `InvalidInputError` if not an integer or zero. \r\n - Example: `generate_divisor_list(6)` \u2192 `[1, 2, 3, 6]`\r\n\r\n**generate_multiple_list(base_number, limit, positive_only=True)**\r\nGenerates multiples of a number up to `limit` times. \r\n - Parameters: `base_number` (int), `limit` (int), `positive_only` (bool) \r\n - Returns: List of multiples. \r\n - Raises: `InvalidInputError` if not integers, number is zero, or limit < 1. \r\n - Example: `generate_multiple_list(3, 5)` \u2192 `[3, 6, 9, 12, 15]`\r\n\r\n**common_divisors(numbers)**\r\nGenerates common divisors for a list of numbers. \r\n - Parameter: `numbers` (list) \r\n - Returns: List of common divisors. \r\n - Raises: `InvalidInputError` if not a list or contains non-integers; `MathError` if fewer than 2 non-zero elements. \r\n - Example: `common_divisors([12, 18])` \u2192 `[1, 2, 3, 6]`\r\n\r\n**greatest_common_divisor(numbers)**\r\nComputes the GCD of a list of numbers. \r\n - Parameter: `numbers` (list) \r\n - Returns: GCD value. \r\n - Raises: `InvalidInputError` if not a list or contains non-integers; `MathError` if fewer than 2 non-zero elements. \r\n - Example: `greatest_common_divisor([12, 18])` \u2192 `6`\r\n\r\n**least_common_multiple(numbers)**\r\nComputes the LCM of a list of numbers. \r\n - Parameter: `numbers` (list) \r\n - Returns: LCM value. \r\n - Raises: `InvalidInputError` if not a list, contains non-integers, or zeros; `MathError` if fewer than 2 elements. \r\n - Example: `least_common_multiple([4, 6])` \u2192 `12`\r\n\r\n---\r\n\r\n### \ud83d\udc6f Twin Prime and Abundant Number Functions (twin_abundant.py)\r\n\r\n**is_twin_prime(input_number)**\r\nChecks if a number is a twin prime. \r\n - Parameter: `input_number` (int) \r\n - Returns: `True` if twin prime, `False` otherwise. \r\n - Raises: `InvalidInputError` if not an integer. \r\n - Example: `is_twin_prime(5)` \u2192 `True`\r\n\r\n**generate_twin_prime_list(limit)**\r\nGenerates twin primes from 2 to `limit`. \r\n - Parameter: `limit` (int) \r\n - Returns: List of twin primes. \r\n - Raises: `InvalidInputError` if not an integer >= 2. \r\n - Example: `generate_twin_prime_list(20)` \u2192 `[3, 5, 7, 11, 13, 17, 19]`\r\n\r\n**is_abundant_number(input_number)**\r\nChecks if a number is abundant. \r\n - Parameter: `input_number` (int) \r\n - Returns: `True` if abundant, `False` otherwise. \r\n - Raises: `InvalidInputError` if not a positive integer. \r\n - Example: `is_abundant_number(12)` \u2192 `True`\r\n\r\n**generate_abundant_number_list(limit)**\r\nGenerates abundant numbers from 1 to `limit`. \r\n - Parameter: `limit` (int) \r\n - Returns: List of abundant numbers. \r\n - Raises: `InvalidInputError` if not a positive integer. \r\n - Example: `generate_abundant_number_list(20)` \u2192 `[12, 18, 20]`\r\n\r\n---\r\n\r\n### \ud83d\udd0d Prime Factorization Functions (prime_factorization.py)\r\n\r\n**prime_factors(input_number)**\r\nFactorizes a number into prime factors. \r\n - Parameter: `input_number` (int) \r\n - Returns: List of prime factors. \r\n - Raises: `InvalidInputError` if not a positive integer > 1. \r\n - Example: `prime_factors(12)` \u2192 `[2, 2, 3]`\r\n\r\n**greatest_common_prime_divisor(number1, number2)**\r\nFinds the greatest common prime divisor of two numbers. \r\n - Parameters: `number1`, `number2` (int) \r\n - Returns: Greatest common prime divisor. \r\n - Raises: `InvalidInputError` if not positive integers > 1; `MathError` if no common prime divisor. \r\n - Example: `greatest_common_prime_divisor(12, 18)` \u2192 `3`\r\n\r\n---\r\n\r\n### \ud83e\uddf5 List and String Processing Functions (string_processing.py)\r\n\r\n**remove_duplicates(items)**\r\nRemoves duplicates from a list and sorts in descending order. \r\n - Parameter: `items` (list) \r\n - Returns: Sorted list without duplicates. \r\n - Raises: `InvalidInputError` if not a list/tuple. \r\n - Example: `remove_duplicates([1, 2, 2, 3])` \u2192 `[3, 2, 1]`\r\n\r\n**extract_digits_from_string(text)**\r\nExtracts individual digits from a string. \r\n - Parameter: `text` (str) \r\n - Returns: List of digits. \r\n - Example: `extract_digits_from_string(\"abc123\")` \u2192 `[1, 2, 3]`\r\n\r\n**extract_numbers_from_string(text)**\r\nExtracts full numbers from a string. \r\n - Parameter: `text` (str) \r\n - Returns: List of numbers. \r\n - Example: `extract_numbers_from_string(\"abc123def456\")` \u2192 `[123, 456]`\r\n\r\n**extract_characters(text)**\r\nExtracts non-digit characters from a string. \r\n - Parameter: `text` (str) \r\n - Returns: List of characters. \r\n - Example: `extract_characters(\"a1b2c3\")` \u2192 `['a', 'b', 'c']`\r\n\r\n**compress_string(text, compress_type)**\r\nCompresses a string using two methods. \r\n - Parameters: `text` (str), `compress_type` (int) \r\n - Returns: Compressed string. \r\n - Example (type 1): `compress_string(\"google\", 1)` \u2192 `'e2gl2o'` \r\n - Example (type 2): `compress_string(\"google\", 2)` \u2192 `'g2ogle'`\r\n\r\n**compress_string_without_numbers(input_text)**\r\nCompresses a string by removing consecutive duplicates. \r\n - Parameter: `input_text` (str) \r\n - Returns: Compressed string. \r\n - Example: `compress_string_without_numbers(\"hhhoocssssiiinnnhhhhh\")` \u2192 `'hocsinh'`\r\n\r\n**decompress_string(text)**\r\nDecompresses a string with numeric counts. \r\n - Parameter: `text` (str) \r\n - Returns: Decompressed string. \r\n - Example: `decompress_string(\"g2ogle\")` \u2192 `\"google\"`\r\n\r\n**unique_characters_string(text)**\r\nCreates a string with unique characters in order of appearance. \r\n - Parameter: `text` (str) \r\n - Returns: String with no duplicates. \r\n - Example: `unique_characters_string(\"google\")` \u2192 `\"gole\"`\r\n\r\n---\r\n\r\n### \ud83c\udfdb\ufe0f Caesar Cipher Functions (caesar_cipher.py)\r\n\r\n**caesar_cipher_to_numbers(text, shift)**\r\nConverts a string to a list of Caesar cipher numbers. \r\n - Parameters: `text` (str), `shift` (int) \r\n - Returns: List of shifted numbers. \r\n - Example: `caesar_cipher_to_numbers(\"ABC\", 3)` \u2192 `[3, 4, 5]`\r\n\r\n**caesar_cipher_from_numbers(numbers, shift)**\r\nDecodes a list of Caesar cipher numbers into a string. \r\n - Parameters: `numbers` (list), `shift` (int) \r\n - Returns: Decoded string. \r\n - Example: `caesar_cipher_from_numbers([3, 4, 5], 3)` \u2192 `\"ABC\"`\r\n\r\n---\r\n\r\n### \ud83d\udca5 Special Calculation Functions (special_calculations.py)\r\n\r\n**calculate_electricity_bill_vietnam(old_reading, new_reading)**\r\nCalculates an electricity bill based on Vietnamese pricing tiers. \r\n - Parameters: `old_reading`, `new_reading` (float) \r\n - Returns: String with consumption and cost. \r\n - Example: `calculate_electricity_bill_vietnam(100, 150)` \u2192 `\"- Electricity consumed this month: 50.0 Kwh\\n- Electricity bill this month: 83900.0 VND\"`\r\n\r\n**largest_number_with_digit_sum(digit_count, target_sum)**\r\nFinds the largest number with `digit_count` digits summing to `target_sum`. \r\n - Parameters: `digit_count` (int), `target_sum` (int) \r\n - Returns: Largest number as a string. \r\n - Example: `largest_number_with_digit_sum(3, 15)` \u2192 `'960'`\r\n\r\n---\r\n\r\n### \ud83d\udd01 Sequence Generation Functions (sequence_generation.py)\r\n\r\n**generate_sequence_rule_1(count)**\r\nGenerate a sequence according to the rule: 1 divisible by 1, 2 by 2, etc. \r\n - Parameter: `count` (int) \r\n - Returns: List of sequence numbers. \r\n - Example: `generate_sequence_rule_1(10)` \u2192 `[1, 4, 6, 9, 12, 15, 16, 20, 24, 28]`\r\n\r\n**generate_sequence_rule_2(base, count)**\r\nGenerates `count` multiples of `base`. \r\n - Parameters: `base` (int), `count` (int) \r\n - Returns: List of multiples. \r\n - Example: `generate_sequence_rule_2(2, 5)` \u2192 `[2, 4, 6, 8, 10]`\r\n\r\n**generate_sequence_rule_3(count, base)**\r\nGenerates powers of `base` from 1 to `count`. \r\n - Parameters: `count` (int), `base` (int) \r\n - Returns: List of powers. \r\n - Example: `generate_sequence_rule_3(5, 2)` \u2192 `[2, 4, 8, 16, 32]`\r\n\r\n---\r\n\r\n### \ud83d\udd22 Inversion Counting Functions (inversion_counting.py)\r\n\r\n**count_inversions(numbers)**\r\nCounts the number of inversions in a list. \r\n - Parameter: `numbers` (list) \r\n - Returns: Number of inversions. \r\n - Example: `count_inversions([1, 3, 2])` \u2192 `1`\r\n\r\n---\r\n\r\n## \ud83d\udccb Sample Command List for the `pchjlib` Library\r\n\r\n## 1. Primes and Emirps\r\n\r\n- **Check if a number is prime:**\r\n`python pchjmain.py primes_and_emirps --is_prime <number>` \r\n _Example:_ `python pchjmain.py primes_and_emirps --is_prime 17`\r\n\r\n- **Generate a list of primes:**\r\n`python pchjmain.py primes_and_emirps --generate_prime_list <limit>` \r\n _Example:_ `python pchjmain.py primes_and_emirps --generate_prime_list 50`\r\n\r\n- **Check if a number is an emirp:**\r\n`python pchjmain.py primes_and_emirps --is_emirp <number>` \r\n _Example:_ `python pchjmain.py primes_and_emirps --is_emirp 13`\r\n\r\n- **Generate a list of emirps:**\r\n`python pchjmain.py primes_and_emirps --generate_emirp_list <limit>` \r\n _Example:_ `python pchjmain.py primes_and_emirps --generate_emirp_list 100`\r\n\r\n## 2. Twin Primes and Abundant Numbers\r\n\r\n- **Check if a number is a twin prime:**\r\n`python pchjmain.py twin_primes_and_abundant --is_twin_prime <number>` \r\n _Example:_ `python pchjmain.py twin_primes_and_abundant --is_twin_prime 5`\r\n\r\n- **Generate a list of twin primes:**\r\n`python pchjmain.py twin_primes_and_abundant --generate_twin_prime_list <limit>` \r\n _Example:_ `python pchjmain.py twin_primes_and_abundant --generate_twin_prime_list 50`\r\n\r\n- **Check if a number is abundant:**\r\n`python pchjmain.py twin_primes_and_abundant --is_abundant <number>` \r\n _Example:_ `python pchjmain.py twin_primes_and_abundant --is_abundant 12`\r\n\r\n- **Generate a list of abundant numbers:**\r\n`python pchjmain.py twin_primes_and_abundant --generate_abundant_list <limit>` \r\n _Example:_ `python pchjmain.py twin_primes_and_abundant --generate_abundant_list 100`\r\n\r\n## 3. Fibonacci Sequence\r\n\r\n- **Compute the Fibonacci number at a given index:**\r\n`python pchjmain.py fibonacci --at_index <index>` \r\n _Example:_ `python pchjmain.py fibonacci --at_index 10`\r\n\r\n- **Generate a list of Fibonacci numbers:**\r\n`python pchjmain.py fibonacci --generate_list <count>` \r\n _Example:_ `python pchjmain.py fibonacci --generate_list 5`\r\n\r\n## 4. Special Numbers 1 (Perfect, Narcissistic, Amicable, Happy)\r\n\r\n- **Check if a number is perfect:**\r\n`python pchjmain.py special_numbers_1 --is_perfect <number>` \r\n _Example:_ `python pchjmain.py special_numbers_1 --is_perfect 28`\r\n\r\n- **Generate a list of perfect numbers:**\r\n`python pchjmain.py special_numbers_1 --generate_perfect_list <limit>` \r\n _Example:_ `python pchjmain.py special_numbers_1 --generate_perfect_list 1000`\r\n\r\n- **Check if a number is narcissistic:**\r\n`python pchjmain.py special_numbers_1 --is_narcissistic <number>` \r\n _Example:_ `python pchjmain.py special_numbers_1 --is_narcissistic 153`\r\n\r\n- **Generate a list of narcissistic numbers:**\r\n`python pchjmain.py special_numbers_1 --generate_narcissistic_list <limit>` \r\n _Example:_ `python pchjmain.py special_numbers_1 --generate_narcissistic_list 1000`\r\n\r\n- **Check if two numbers are amicable:**\r\n`python pchjmain.py special_numbers_1 --are_amicable <number1> <number2>` \r\n _Example:_ `python pchjmain.py special_numbers_1 --are_amicable 220 284`\r\n\r\n- **Check if a number is happy:**\r\n`python pchjmain.py special_numbers_1 --is_happy <number>` \r\n _Example:_ `python pchjmain.py special_numbers_1 --is_happy 19`\r\n\r\n- **Generate a list of happy numbers:**\r\n`python pchjmain.py special_numbers_1 --generate_happy_list <limit>` \r\n _Example:_ `python pchjmain.py special_numbers_1 --generate_happy_list 100`\r\n\r\n## 5. Special Numbers 2 (Square, Strong, Friendly)\r\n\r\n- **Check if a number is a perfect square:**\r\n`python pchjmain.py special_numbers_2 --is_square <number>` \r\n _Example:_ `python pchjmain.py special_numbers_2 --is_square 16`\r\n\r\n- **Generate a list of perfect squares:**\r\n`python pchjmain.py special_numbers_2 --generate_square_list <limit>` \r\n _Example:_ `python pchjmain.py special_numbers_2 --generate_square_list 100`\r\n\r\n- **Check if a number is strong:**\r\n`python pchjmain.py special_numbers_2 --is_strong <number>` \r\n _Example:_ `python pchjmain.py special_numbers_2 --is_strong 145`\r\n\r\n- **Check if two numbers are friendly:**\r\n`python pchjmain.py special_numbers_2 --are_friendly <number1> <number2>` \r\n _Example:_ `python pchjmain.py special_numbers_2 --are_friendly 30 140`\r\n\r\n## 6. Divisors and Multiples\r\n\r\n- **Generate a list of divisors:**\r\n`python pchjmain.py divisors_and_multiples --generate_divisor_list <number>` \r\n _Example:_ `python pchjmain.py divisors_and_multiples --generate_divisor_list 28`\r\n\r\n- **Generate a list of multiples:**\r\n`python pchjmain.py divisors_and_multiples --generate_multiple_list <number> <limit>` \r\n _Example:_ `python pchjmain.py divisors_and_multiples --generate_multiple_list 3 20`\r\n\r\n- **Find common divisors:**\r\n`python pchjmain.py divisors_and_multiples --common_divisors <number1> <number2> [<number3> ...]` \r\n _Example:_ `python pchjmain.py divisors_and_multiples --common_divisors 12 18 24`\r\n\r\n- **Compute GCD (Greatest Common Divisor):**\r\n`python pchjmain.py divisors_and_multiples --gcd <number1> <number2> [<number3> ...]` \r\n _Example:_ `python pchjmain.py divisors_and_multiples --gcd 12 18 24`\r\n\r\n- **Compute LCM (Least Common Multiple):**\r\n`python pchjmain.py divisors_and_multiples --lcm <number1> <number2> [<number3> ...]` \r\n _Example:_ `python pchjmain.py divisors_and_multiples --lcm 4 5 6`\r\n\r\n## 7. Prime Factorization\r\n\r\n- **Prime factorization:**\r\n`python pchjmain.py prime_factorization --prime_factors <number>` \r\n _Example:_ `python pchjmain.py prime_factorization --prime_factors 100`\r\n\r\n- **Greatest common prime divisor:**\r\n`python pchjmain.py prime_factorization --greatest_common_prime_divisor <number1> <number2>` \r\n _Example:_ `python pchjmain.py prime_factorization --greatest_common_prime_divisor 12 18`\r\n\r\n## 8. String Processing\r\n\r\n- **Remove duplicate elements:**\r\n`python pchjmain.py string_processing --remove_duplicates <elem1> <elem2> ...` \r\n _Example:_ `python pchjmain.py string_processing --remove_duplicates 1 2 2 3 4 4`\r\n\r\n- **Extract digits:**\r\n`python pchjmain.py string_processing --extract_digits \"<string>\"` \r\n _Example:_ `python pchjmain.py string_processing --extract_digits \"a1b2c3\"`\r\n\r\n- **Extract numbers:**\r\n`python pchjmain.py string_processing --extract_numbers \"<string>\"` \r\n _Example:_ `python pchjmain.py string_processing --extract_numbers \"a12b34c56\"`\r\n\r\n- **Extract non-digit characters:**\r\n`python pchjmain.py string_processing --extract_characters \"<string>\"` \r\n _Example:_ `python pchjmain.py string_processing --extract_characters \"a1b2c3\"`\r\n\r\n- **Compress a string (type 1 or 2):**\r\n`python pchjmain.py string_processing --compress \"<string>\" <compress_type>` \r\n _Example:_ `python pchjmain.py string_processing --compress \"aaabbbcc\" 1`\r\n\r\n- **Compress a string without counts:**\r\n`python pchjmain.py string_processing --compress_without_numbers \"<string>\"` \r\n _Example:_ `python pchjmain.py string_processing --compress_without_numbers \"aaabbbcc\"`\r\n\r\n- **Decompress a string:**\r\n`python pchjmain.py string_processing --decompress \"<compressed_string>\"` \r\n _Example:_ `python pchjmain.py string_processing --decompress \"a3b2c1\"`\r\n\r\n- **Get unique characters in a string:**\r\n`python pchjmain.py string_processing --unique_characters \"<string>\"` \r\n _Example:_ `python pchjmain.py string_processing --unique_characters \"aaabbbcc\"`\r\n\r\n## 9. Caesar Cipher\r\n\r\n- **Convert text to Caesar numbers:**\r\n`python pchjmain.py caesar_cipher --to_numbers \"<text>\" <shift>` \r\n _Example:_ `python pchjmain.py caesar_cipher --to_numbers \"abc\" 3`\r\n\r\n- **Convert Caesar numbers back to text:**\r\n`python pchjmain.py caesar_cipher --from_numbers <shift> <num1> <num2> ...` \r\n _Example:_ `python pchjmain.py caesar_cipher --from_numbers 3 4 5 6`\r\n\r\n## 10. Special Calculations\r\n\r\n- **Calculate an electricity bill:**\r\n`python pchjmain.py special_calculations --electricity_bill <old_reading> <new_reading>` \r\n _Example:_ `python pchjmain.py special_calculations --electricity_bill 100 200`\r\n\r\n- **Find the largest number with given digits sum:**\r\n`python pchjmain.py special_calculations --largest_number <digit_count> <digit_sum>` \r\n _Example:_ `python pchjmain.py special_calculations --largest_number 3 15`\r\n\r\n## 11. Sequence Generation\r\n\r\n- **Generate sequence by rule 1:**\r\n`python pchjmain.py sequence_generation --rule1 <count>` \r\n _Example:_ `python pchjmain.py sequence_generation --rule1 5`\r\n\r\n- **Generate sequence by rule 2:**\r\n`python pchjmain.py sequence_generation --rule2 <base> <count>` \r\n _Example:_ `python pchjmain.py sequence_generation --rule2 2 5`\r\n\r\n- **Generate sequence by rule 3:**\r\n`python pchjmain.py sequence_generation --rule3 <count> <base>` \r\n _Example:_ `python pchjmain.py sequence_generation --rule3 5 2`\r\n\r\n## 12. Inversion Counting\r\n\r\n- **Count inversions in a list:**\r\n`python pchjmain.py inversion_counting --count <elem1> <elem2> ...` \r\n _Example:_ `python pchjmain.py inversion_counting --count 2 3 1 4`\r\n\r\n---\r\n\r\n### Note\r\n\r\n- Replace `<...>` with actual values when running the command. \r\n- Ensure commands are executed in the directory containing `pchjmain.py`. \r\n- For detailed help on any category, run `python pchjmain.py <category> -h` (e.g., `python pchjmain.py primes_and_emirps -h`).\r\n\r\n---\r\n\r\n## \ud83e\uddea Running Tests\r\n\r\nTo run the unit tests for the library, navigate to the project root and execute:\r\n\r\n```bash\r\npython -m unittest discover tests\r\n```\r\n\r\nThis will discover and run all tests in the `tests/` directory. Ensure the library is installed in editable mode (`pip install -e .`) for proper import resolution.\r\n\r\n---\r\n\r\n## \ud83d\udee0\ufe0f Update History\r\n\r\n**\ud83d\udcc5 Latest Update:** August 15, 2025\r\n**\ud83d\udce6 Total Releases:** 99\r\n\r\n### \ud83d\udccc 2025\r\n#### 1.7.2 \u2192 1.7.1 (August 15, 2025)\r\n- Optimize the `is_prime` function.\r\n\r\n#### 1.7.0 (August 12, 2025)\r\n- **Performance Improvements**: Implemented merge sort for O(n log n) inversion counting; added Pollard's Rho for faster prime factorization on large numbers; made sequence generation dynamic to handle larger counts; integrated optional gmpy2 for accelerated GCD/LCM.\r\n- **Code Quality Enhancements**: Standardized function names (e.g., `calculate_electricity_bill_Vietnamese` to `calculate_electricity_bill_vietnam`); replaced wildcard imports with explicit ones in `__init__.py`; fixed bug in `largest_number_with_digit_sum` for correct largest output (e.g., '960' for 3 digits sum 15); improved CLI error handling with detailed tracebacks; added user warning for side-effects in `pchjicon.py`; made `Miller-Rabin` primality test deterministic using fixed witnesses.\r\n- **Documentation Updates**: Fixed incorrect examples in README (e.g., largest number); summarized update history for brevity; removed redundant sections and added warnings for probabilistic methods (now deterministic) and side-effects.\r\n\r\n#### 1.6.5 \u2192 1.5.0 (August 11-12, 2025)\r\n- Fixed minor bugs and optimized `generate_sequence_rule_3`/`generate_sequence_rule_2`.\r\n- Updated `is_strong_number` to standard factorion definition.\r\n- Removed `solve_equation` and its CLI category.\r\n- Eliminated `numpy` dependency; added optional gmpy2 integration.\r\n- Added type hints, examples, and performance optimizations (e.g., iterative Fibonacci).\r\n\r\n#### 1.4.5 \u2192 1.3.0 (August 7-8, 2025)\r\n- Fixed minor bugs.\r\n\r\n#### 1.2.3 \u2192 1.0.1 (August 4\u20135, 2025)\r\n- Removed unused functions; added logo support via `pchj-icon`.\r\n- Added Sample Command List; enhanced CLI.\r\n\r\n#### 1.0.0 \u2192 0.1.5.1 (August 3-4, 2025)\r\n- Major overhaul: Optimizations, error handling, documentation, and tests.\r\n- Removed legacy dependencies and functions; switched README to English.\r\n\r\n#### 0.1.5 \u2192 0.1.4 (August 2, 2025)\r\n- Removed Roman numeral conversion; fixed matrix program.\r\n- Added negative divisors/multiples; merged string compression.\r\n\r\n#### 0.1.3.2 \u2192 0.1.2 (August 1, 2025)\r\n- Minor fixes; consolidated strong-number logic; optimized Fibonacci/primes.\r\n\r\n#### 0.1.1.3 \u2192 0.1.0.7 (July 31, 2025)\r\n- README updates; dependency fixes.\r\n\r\n#### 0.1.0.6 \u2192 0.1.0.3 (July 28\u201330, 2025)\r\n- Bug fixes.\r\n\r\n#### 0.1.0.2 \u2192 0.1.0 (July 28, 2025)\r\n- Minor fixes; removed legacy functions; code overhaul.\r\n\r\n#### 0.0.5.2.1 \u2192 0.0.5.0 (July 26-27, 2025)\r\n- README tweaks; updated teen code.\r\n\r\n### \ud83d\udccc 2024\r\n- **0.0.4.1 (October 17, 2024)**: Added sequence creation; updated one-two-three.\r\n- **0.0.4.0 \u2192 0.0.3.5 (May 3\u20135, 2024)**: README fixes; updated Christmas tree variants; testing.\r\n- **0.0.3.4 (February 26, 2024)**: Added common divisors list.\r\n- **0.0.3.3 \u2192 0.0.3 (February 20\u201321, 2024)**: README enhancements; added abundant check and unique string; removed duplicates check.\r\n- **0.0.2.10 \u2192 0.0.2.6 (February 18\u201319, 2024)**: README updates; testing; switched to MIT License.\r\n- **0.0.2.5 \u2192 0.0.2.1 (February 14\u201318, 2024)**: README and tests.\r\n- **0.0.2 \u2192 0.0.0.1 (February 14, 2024)**: Dependency fixes; testing; initial release.\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A Python toolkit for mathematical operations and string processing, including prime numbers, Fibonacci sequences, and Caesar ciphers.",
    "version": "1.7.2",
    "project_urls": {
        "Homepage": "https://github.com/Joesifer/pchjlib"
    },
    "split_keywords": [
        "pchjlib",
        " math",
        " education",
        " numbers",
        " prime numbers",
        " fibonacci",
        " string processing",
        " caesar cipher"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ced8e2fd0c0bf49f06048771a1aa8d6ad562e98d62d86dda99aaa759f3d488a3",
                "md5": "9884a5c53a79447159f2c4d269d6923c",
                "sha256": "4a6945fb756d8f66b18a1aa21ffee2065fc1ec7dbe6092b43622e4a645b7858a"
            },
            "downloads": -1,
            "filename": "pchjlib-1.7.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9884a5c53a79447159f2c4d269d6923c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 59166,
            "upload_time": "2025-08-15T00:10:04",
            "upload_time_iso_8601": "2025-08-15T00:10:04.900952Z",
            "url": "https://files.pythonhosted.org/packages/ce/d8/e2fd0c0bf49f06048771a1aa8d6ad562e98d62d86dda99aaa759f3d488a3/pchjlib-1.7.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3ce69d90ab34705e5321dbef2da16456ec5774180a1a9ff1ba0854ca80de1229",
                "md5": "b9028904c031d3e0b31fb0df1f749424",
                "sha256": "9a728da77881a475b6f8a0c8eabb4a7dc6833848b135a74bda5b347fc5ab60d0"
            },
            "downloads": -1,
            "filename": "pchjlib-1.7.2.tar.gz",
            "has_sig": false,
            "md5_digest": "b9028904c031d3e0b31fb0df1f749424",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 71240,
            "upload_time": "2025-08-15T00:10:07",
            "upload_time_iso_8601": "2025-08-15T00:10:07.349083Z",
            "url": "https://files.pythonhosted.org/packages/3c/e6/9d90ab34705e5321dbef2da16456ec5774180a1a9ff1ba0854ca80de1229/pchjlib-1.7.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-15 00:10:07",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Joesifer",
    "github_project": "pchjlib",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "pchjlib"
}
        
Elapsed time: 1.29087s