Skip to main content

Generate ranges of complex numbers - rectangular grids and linear sequences in the complex plane

Project description

complex-range

PyPI version Python versions License: MIT

Generate ranges of complex numbers in Python - rectangular grids and linear sequences in the complex plane.

Installation

pip install complex-range

Quick Start

from complex_range import complex_range

# Rectangular grid from origin to 2+2j
grid = complex_range(0, 2+2j)
# [0j, 1j, 2j, (1+0j), (1+1j), (1+2j), (2+0j), (2+1j), (2+2j)]

# Linear range along a diagonal
line = complex_range([0, 3+3j])
# [0j, (1+1j), (2+2j), (3+3j)]

Features

  • Rectangular ranges: Generate 2D grids of complex numbers
  • Linear ranges: Generate points along a line in the complex plane
  • Flexible step sizes: Control spacing independently for real and imaginary axes
  • Negative steps: Support for descending ranges with negative step values
  • Farey sequence subdivision: Create refined grids using number-theoretic sequences
  • Iteration order control: Choose whether to iterate real or imaginary component first
  • Pure Python: No dependencies required

Usage

Rectangular Ranges

Generate a grid of complex numbers between two corners:

from complex_range import complex_range

# Basic rectangular range
complex_range(0, 2+2j)
# Returns: [0j, 1j, 2j, (1+0j), (1+1j), (1+2j), (2+0j), (2+1j), (2+2j)]

# Single argument: range from 0 to z
complex_range(2+3j)
# Returns grid from 0 to 2+3j (3×4 = 12 points)

# With custom step size (complex number)
complex_range(0, 2+2j, 0.5+0.5j)
# Real step = 0.5, Imaginary step = 0.5

# With separate real and imaginary steps
complex_range(0, 4+6j, [2, 3])
# Real step = 2, Imaginary step = 3

Linear Ranges

Generate points along a line (diagonal) in the complex plane:

# Linear from 0 to endpoint
complex_range([3+3j])
# Returns: [0j, (1+1j), (2+2j), (3+3j)]

# Linear between two points
complex_range([-1-1j, 2+2j])
# Returns: [(-1-1j), 0j, (1+1j), (2+2j)]

# Linear with custom step
complex_range([0, 4+4j], [2, 2])
# Returns: [0j, (2+2j), (4+4j)]

# Linear with complex step
complex_range([0, 4+4j], 2+2j)
# Returns: [0j, (2+2j), (4+4j)]

# Descending linear range with negative step
complex_range([2+2j, 0], -1-1j)
# Returns: [(2+2j), (1+1j), 0j]

Options

increment_first

Control the iteration order for rectangular ranges:

# Default: increment imaginary first
complex_range(0, 2+2j, 1+1j, increment_first='im')
# [0j, 1j, 2j, (1+0j), (1+1j), (1+2j), (2+0j), (2+1j), (2+2j)]

# Increment real first
complex_range(0, 2+2j, 1+1j, increment_first='re')
# [0j, (1+0j), (2+0j), 1j, (1+1j), (2+1j), 2j, (1+2j), (2+2j)]

farey_range

Use Farey sequence to create a finer subdivision of the grid:

# Regular grid
regular = complex_range(0, 4+4j, 2+2j)
# Returns 9 points

# Farey subdivision (step must be integer)
farey = complex_range(0, 4+4j, 2+2j, farey_range=True)
# Returns 81 points using Farey sequence F_2

# Farey sequence of order n creates fractions 0, 1/n, ..., 1
from complex_range import farey_sequence
farey_sequence(3)
# [Fraction(0,1), Fraction(1,3), Fraction(1,2), Fraction(2,3), Fraction(1,1)]

API Reference

complex_range(z1, z2=None, step=None, *, increment_first='im', farey_range=False)

Generate a range of complex numbers.

Parameters:

Parameter Type Description
z1 complex, list, or tuple First corner (rectangular) or endpoint specification (linear)
z2 complex, optional Second corner for rectangular range
step complex, list, or tuple, optional Step size(s). Default: 1+1j
increment_first 'im' or 're' Which component to iterate first. Default: 'im'
farey_range bool Use Farey sequence subdivision. Default: False

Returns: List[complex] - List of complex numbers

Raises: ComplexRangeError - If farey_range=True with non-integer step

farey_sequence(n)

Generate the Farey sequence of order n.

Parameters:

Parameter Type Description
n int Order of the Farey sequence (must be positive)

Returns: List[Fraction] - Sorted list of fractions in [0, 1]

Understanding the Ranges

Rectangular Range

A rectangular range generates all points on a 2D grid:

Im ↑
 3 │  ·  ·  ·
 2 │  ·  ·  ·
 1 │  ·  ·  ·
 0 │  ·  ·  ·
   └──────────→ Re
      0  1  2

With increment_first='im' (default), points are generated column by column: (0,0), (0,1), (0,2), (0,3), (1,0), (1,1), ...

Linear Range

A linear range generates points along a diagonal:

Im ↑
 3 │        ·
 2 │     ·
 1 │  ·
 0 │·
   └──────────→ Re
   0  1  2  3

Points increment along both axes simultaneously.

Examples

Visualizing a Rectangular Grid

import matplotlib.pyplot as plt
from complex_range import complex_range

points = complex_range(0, 3+3j)
x = [p.real for p in points]
y = [p.imag for p in points]

plt.scatter(x, y)
plt.xlabel('Real')
plt.ylabel('Imaginary')
plt.title('Rectangular Complex Range')
plt.grid(True)
plt.show()

Creating a Refined Grid with Farey Sequence

from complex_range import complex_range

# Coarse grid: 3×3 = 9 points
coarse = complex_range(0, 2+2j, 1+1j)

# Refined grid using Farey sequence
refined = complex_range(0, 2+2j, 2+2j, farey_range=True)
print(f"Coarse: {len(coarse)} points, Refined: {len(refined)} points")

Iterating Over Complex Regions

from complex_range import complex_range

# Evaluate a function over a region of the complex plane
def mandelbrot_escape(c, max_iter=100):
    z = 0
    for i in range(max_iter):
        z = z*z + c
        if abs(z) > 2:
            return i
    return max_iter

# Create a grid and evaluate
grid = complex_range(-2-1.5j, 1+1.5j, [0.1, 0.1])
escapes = [mandelbrot_escape(c) for c in grid]

Author

Daniele Gregori

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

# Clone the repository
git clone https://github.com/Daniele-Gregori/PyPI-packages.git
cd PyPI-packages/packages/complex-range

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run type checking
mypy src/complex_range

# Format code
black src tests
isort src tests

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Original Wolfram Language ComplexRange resource function contributed by Daniele Gregori and reviewed by the Wolfram Review Team.

Changelog

See CHANGELOG.md for a list of changes.

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

complex_range-1.0.0.tar.gz (18.3 kB view details)

Uploaded Source

Built Distribution

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

complex_range-1.0.0-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file complex_range-1.0.0.tar.gz.

File metadata

  • Download URL: complex_range-1.0.0.tar.gz
  • Upload date:
  • Size: 18.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for complex_range-1.0.0.tar.gz
Algorithm Hash digest
SHA256 6afd165e820e7ea4ff30f1226c9b898cf631b1a7671b713688c7f4c1ad8f1f65
MD5 3e52c7894f17eaed50da1336be5799c3
BLAKE2b-256 0b29dc0fd8b9008589f5f37b9c225a7cd9ee661f2a195f455f7f087261be5d31

See more details on using hashes here.

File details

Details for the file complex_range-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: complex_range-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 11.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for complex_range-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 63b65de697475df017eaa6bb37ab9df5a96a0de3fa8e4eee6c83f62b7e381fd7
MD5 2ac9877f21dad460c198092e5066e891
BLAKE2b-256 9bd63764ab44146c200f49b139e3d0f2538a83a48b7e896b13b66487d898b46b

See more details on using hashes here.

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