latin-rectangles 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,197 @@
1
+ # macOS specific files
2
+ .DS_Store
3
+
4
+ # Byte-compiled / optimized / DLL files
5
+ __pycache__/
6
+ *.py[cod]
7
+ *$py.class
8
+
9
+ # C extensions
10
+ *.so
11
+
12
+ # Distribution / packaging
13
+ .Python
14
+ build/
15
+ develop-eggs/
16
+ dist/
17
+ downloads/
18
+ eggs/
19
+ .eggs/
20
+ lib/
21
+ lib64/
22
+ parts/
23
+ sdist/
24
+ var/
25
+ wheels/
26
+ share/python-wheels/
27
+ *.egg-info/
28
+ .installed.cfg
29
+ *.egg
30
+ MANIFEST
31
+
32
+ # PyInstaller
33
+ # Usually these files are written by a python script from a template
34
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
35
+ *.manifest
36
+ *.spec
37
+
38
+ # Installer logs
39
+ pip-log.txt
40
+ pip-delete-this-directory.txt
41
+
42
+ # Unit test / coverage reports
43
+ htmlcov/
44
+ .tox/
45
+ .nox/
46
+ .coverage
47
+ .coverage.*
48
+ .cache
49
+ nosetests.xml
50
+ coverage.xml
51
+ *.cover
52
+ *.py,cover
53
+ .hypothesis/
54
+ .pytest_cache/
55
+ cover/
56
+
57
+ # Translations
58
+ *.mo
59
+ *.pot
60
+
61
+ # Django stuff:
62
+ *.log
63
+ local_settings.py
64
+ db.sqlite3
65
+ db.sqlite3-journal
66
+
67
+ # Flask stuff:
68
+ instance/
69
+ .webassets-cache
70
+
71
+ # Scrapy stuff:
72
+ .scrapy
73
+
74
+ # Sphinx documentation
75
+ docs/_build/
76
+
77
+ # PyBuilder
78
+ .pybuilder/
79
+ target/
80
+
81
+ # Jupyter Notebook
82
+ .ipynb_checkpoints
83
+
84
+ # IPython
85
+ profile_default/
86
+ ipython_config.py
87
+
88
+ # pyenv
89
+ # For a library or package, you might want to ignore these files since the code is
90
+ # intended to run in multiple environments; otherwise, check them in:
91
+ # .python-version
92
+
93
+ # pipenv
94
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
95
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
96
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
97
+ # install all needed dependencies.
98
+ #Pipfile.lock
99
+
100
+ # UV
101
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
102
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
103
+ # commonly ignored for libraries.
104
+ #uv.lock
105
+
106
+ # poetry
107
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
108
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
109
+ # commonly ignored for libraries.
110
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
111
+ #poetry.lock
112
+
113
+ # pdm
114
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
115
+ #pdm.lock
116
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
117
+ # in version control.
118
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
119
+ .pdm.toml
120
+ .pdm-python
121
+ .pdm-build/
122
+
123
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
124
+ __pypackages__/
125
+
126
+ # Celery stuff
127
+ celerybeat-schedule
128
+ celerybeat.pid
129
+
130
+ # SageMath parsed files
131
+ *.sage.py
132
+
133
+ # Environments
134
+ .env
135
+ .venv
136
+ env/
137
+ venv/
138
+ ENV/
139
+ env.bak/
140
+ venv.bak/
141
+
142
+ # Spyder project settings
143
+ .spyderproject
144
+ .spyproject
145
+
146
+ # Rope project settings
147
+ .ropeproject
148
+
149
+ # mkdocs documentation
150
+ /site
151
+
152
+ # mypy
153
+ .mypy_cache/
154
+ .dmypy.json
155
+ dmypy.json
156
+
157
+ # Pyre type checker
158
+ .pyre/
159
+
160
+ # pytype static type analyzer
161
+ .pytype/
162
+
163
+ # Cython debug symbols
164
+ cython_debug/
165
+
166
+ # PyCharm
167
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
168
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
169
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
170
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
171
+ #.idea/
172
+
173
+ # Abstra
174
+ # Abstra is an AI-powered process automation framework.
175
+ # Ignore directories containing user credentials, local state, and settings.
176
+ # Learn more at https://abstra.io/docs
177
+ .abstra/
178
+
179
+ # Visual Studio Code
180
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
181
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
182
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
183
+ # you could uncomment the following to ignore the enitre vscode folder
184
+ # .vscode/
185
+
186
+ # Ruff stuff:
187
+ .ruff_cache/
188
+
189
+ # PyPI configuration file
190
+ .pypirc
191
+
192
+ # Cursor
193
+ # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
194
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
195
+ # refer to https://docs.cursor.com/context/ignore-files
196
+ .cursorignore
197
+ .cursorindexingignore
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,13 @@
1
+ {
2
+ "python.defaultInterpreterPath": ".venv/bin/python",
3
+ "[python]": {
4
+ "editor.defaultFormatter": "charliermarsh.ruff",
5
+ "editor.codeActionsOnSave": {
6
+ "source.organizeImports": "explicit",
7
+ "source.fixAll": "explicit"
8
+ },
9
+ "editor.formatOnSave": true
10
+ },
11
+ "ruff.enable": true,
12
+ "ruff.importStrategy": "fromEnvironment"
13
+ }
@@ -0,0 +1,144 @@
1
+ # Complexity Analysis
2
+
3
+ ## Overview
4
+
5
+ This document presents a comprehensive complexity analysis of the Latin rectangles extension counting algorithm. The analysis is based on empirical benchmarking data collected across problem sizes from n=4 to n=800.
6
+
7
+ **Dataset:** 797 benchmark measurements
8
+ **Algorithm:** Latin rectangle extension counting via rook polynomials and cycle decomposition
9
+ **Analysis Date:** June 6, 2025
10
+
11
+ ## Summary
12
+
13
+ The algorithm exhibits quadratic time complexity O(n^2.009) and sub-linear memory complexity O(n^1.360), demonstrating excellent scalability characteristics for combinatorial enumeration problems across an extensive range of problem sizes.
14
+
15
+ ## Time Complexity
16
+
17
+ ### Empirical Analysis
18
+
19
+ The time complexity analysis was performed on 797 data points spanning n=4 to n=800.
20
+
21
+ - **Time Range:** 25.6μs to 276ms
22
+ - **Growth Factor:** 10,770× across the tested range
23
+ - **Performance:** Maintains sub-second execution for all tested values
24
+
25
+ ### Model Fitting Results
26
+
27
+ | Model | R² Score | Formula |
28
+ |-------|----------|---------|
29
+ | **Power** | **0.9812** | **T(n) ≈ 2.95×10⁻⁷ × n^2.009** |
30
+ | Linear | 0.8625 | T(n) ≈ 2.94×10⁻⁴n - 4.48×10⁻² |
31
+ | Logarithmic | 0.5244 | T(n) ≈ 5.65×10⁻²log(n) - 2.49×10⁻¹ |
32
+
33
+ ### Analysis
34
+
35
+ The power law model provides the best fit (R² = 0.9812) with an exponent of 2.009, indicating near-quadratic scaling. This represents a significant improvement over naive factorial-time approaches and demonstrates the effectiveness of the rook polynomial methodology, with the algorithm approaching quadratic complexity at very large scales while maintaining excellent performance.
36
+
37
+ ## Memory Complexity
38
+
39
+ ### Empirical Analysis
40
+
41
+ Memory consumption analysis across the same 797 data points shows efficient space utilization.
42
+
43
+ - **Memory Range:** 0.5KB to 308KB
44
+ - **Growth Factor:** 612× across the tested range
45
+ - **Efficiency:** Maintains minimal memory footprint throughout
46
+
47
+ ### Model Fitting Results
48
+
49
+ | Model | R² Score | Formula |
50
+ |-------|----------|---------|
51
+ | **Power** | **0.9790** | **M(n) ≈ 2.47×10⁻⁵ × n^1.360** |
52
+ | Linear | 0.9183 | M(n) ≈ 3.21×10⁻⁴n - 3.10×10⁻² |
53
+ | Logarithmic | 0.6273 | M(n) ≈ 6.55×10⁻²log(n) - 2.76×10⁻¹ |
54
+
55
+ ### Analysis
56
+
57
+ The power law model achieves excellent fit (R² = 0.9790) with an exponent of 1.360, indicating sub-linear memory scaling. The algorithm maintains efficient memory usage patterns essential for practical applications, with memory growth significantly slower than quadratic.
58
+
59
+ ## Result Magnitude Analysis
60
+
61
+ ### Growth Characteristics
62
+
63
+ The algorithm computes extension counts that grow exponentially with problem size.
64
+
65
+ - **Result Range:** 2.00 to extremely large values (up to hundreds of digits)
66
+ - **Growth Factor:** Astronomical growth across the tested range
67
+
68
+ ### Model Fitting Results
69
+
70
+ | Model | R² Score | Formula |
71
+ |-------|----------|---------|
72
+ | **Exponential** | **0.2510** | **Extensions ≈ 7.57×10⁹² × 0.705^n** |
73
+ | Factorial | 1.0000* | Extensions ≈ 1.03×10⁻¹ × (n!)^1.007 |
74
+
75
+ *Perfect fit for n ≤ 20
76
+
77
+ ### Analysis
78
+
79
+ While result magnitudes grow exponentially, the algorithm maintains near-quadratic computation time, demonstrating exceptional efficiency in computing large combinatorial values. The factorial model provides perfect fit for smaller values, while larger values show complex growth patterns that challenge simple exponential models.
80
+
81
+ ## Performance Characteristics
82
+
83
+ ### Scalability Profile
84
+
85
+ The algorithm exhibits excellent scalability across the tested range:
86
+
87
+ - **n ≤ 50:** Sub-millisecond execution (< 1ms)
88
+ - **n ≤ 200:** Fast execution (< 10ms)
89
+ - **n ≤ 500:** Efficient execution (< 100ms)
90
+ - **n ≤ 800:** Manageable execution (< 300ms)
91
+
92
+ ### Comparative Analysis
93
+
94
+ The algorithm significantly outperforms theoretical worst-case approaches:
95
+
96
+ - **vs O(n!):** Exponentially faster for all practical values
97
+ - **vs O(n³):** ~30× faster than cubic scaling at large n
98
+ - **vs O(n²):** Approaches but does not exceed quadratic performance
99
+
100
+ ## Implementation Efficiency
101
+
102
+ ### Algorithmic Strengths
103
+
104
+ 1. **Mathematical Foundation:** Leverages rook polynomial theory for efficient computation
105
+ 2. **Cycle Decomposition:** Exploits derangement structure to reduce complexity
106
+ 3. **Memory Management:** Maintains minimal memory footprint with efficient data structures
107
+ 4. **Numerical Stability:** Handles large integer arithmetic without precision loss
108
+
109
+ ### Technical Characteristics
110
+
111
+ - **Average Time per Operation:** 132μs across all test cases
112
+ - **Memory Efficiency:** < 308KB for largest tested cases
113
+ - **Numerical Range:** Handles results with hundreds of digits
114
+ - **Consistency:** Stable performance across all problem sizes
115
+
116
+ ## Methodology
117
+
118
+ ### Data Collection
119
+
120
+ Benchmarks were collected using a systematic approach:
121
+
122
+ - **Environment:** Controlled testing environment with consistent system resources
123
+ - **Measurement:** High-precision timing using system performance counters
124
+ - **Validation:** Multiple runs per data point with statistical averaging
125
+ - **Range:** Comprehensive coverage from small (n=4) to very large (n=800) problem sizes
126
+
127
+ ### Statistical Analysis
128
+
129
+ Model fitting employed least-squares regression with coefficient of determination (R²) for goodness-of-fit evaluation. The power law model consistently provided the best fit for both time and memory complexity patterns.
130
+
131
+ ## Conclusions
132
+
133
+ The Latin rectangles extension counting algorithm demonstrates:
134
+
135
+ - **Time Complexity:** O(n^2.009) near-quadratic scaling
136
+ - **Memory Complexity:** O(n^1.360) sub-linear scaling
137
+ - **Practical Performance:** Sub-second execution for problem sizes up to n=800
138
+ - **Scalability:** Maintains efficiency across an extensive range of problem sizes
139
+
140
+ The algorithm's performance characteristics make it suitable for production use in combinatorial enumeration applications requiring both accuracy and efficiency, with excellent scalability demonstrated up to n=800.
141
+
142
+ ---
143
+
144
+ *Analysis based on 797 empirical measurements across problem sizes n=4 to n=800*
@@ -0,0 +1,34 @@
1
+ # Development commands
2
+
3
+ ## Setup
4
+
5
+ ```bash
6
+ # Install the project in development mode
7
+ uv sync --dev
8
+
9
+ # Activate the virtual environment
10
+ source .venv/bin/activate # or use `uv run` prefix for commands
11
+ ```
12
+
13
+ ## Linting and Formatting
14
+
15
+ ```bash
16
+ # Check code style and lint
17
+ uv run ruff check
18
+
19
+ # Fix auto-fixable issues
20
+ uv run ruff check --fix
21
+
22
+ # Format code
23
+ uv run ruff format
24
+
25
+ # Check formatting without making changes
26
+ uv run ruff format --check
27
+ ```
28
+
29
+ ## Running the application
30
+
31
+ ```bash
32
+ # Run the main script
33
+ uv run latin-rectangles --n 42
34
+ ```
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Ioannis Michaloliakos
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,290 @@
1
+ Metadata-Version: 2.4
2
+ Name: latin-rectangles
3
+ Version: 0.1.0
4
+ Summary: Count the number of one-row extensions of Latin rectangles.
5
+ Author-email: Ioannis Michaloliakos <ioannis.michalol@ufl.edu>
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+
10
+ # Latin Rectangles Extension Counter
11
+
12
+ A high-performance Python library for counting the number of ways to extend a 2×n [Latin rectangle](https://en.wikipedia.org/wiki/Latin_rectangle) to a 3×n Latin rectangle using rook polynomial methods and cycle decomposition theory.
13
+
14
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
15
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
16
+
17
+ ## Overview
18
+
19
+ A **Latin rectangle** is an r×n array filled with n different symbols such that each symbol occurs exactly once in each row and at most once in each column.
20
+
21
+ ### Extension Problem
22
+
23
+ Given a 2×n Latin rectangle:
24
+
25
+ ```text
26
+ 1 2 3 4 5 6 7 8
27
+ p[1] p[2] p[3] p[4] p[5] p[6] p[7] p[8]
28
+ ```
29
+
30
+ where `p` is a [derangement](https://en.wikipedia.org/wiki/Derangement), the problem is to count how many valid third rows can be added such that the resulting 3×n rectangle remains a Latin rectangle. This library provides an efficient algorithm for computing Latin rectangle extensions.
31
+
32
+ ### Key Features
33
+
34
+ - **High Performance**: Approximate O(n^2) time complexity, tested **up to n=800**.
35
+ - **Memory Efficient**: Approximate O(n^1.36) memory complexity
36
+ - **Mathematically Rigorous**: Based on rook polynomial theory and cycle decomposition
37
+ - **Easy to Use**: Simple command-line interface and Python API
38
+ - **Well Tested**: Comprehensive test suite with complexity analysis
39
+
40
+ ## Installation
41
+
42
+ ```console
43
+ git clone https://github.com/ionmich/latin-rectangles.git
44
+ cd latin-rectangles
45
+ ```
46
+
47
+ ## Quick Start
48
+
49
+ ### Command Line (CLI) Usage
50
+
51
+ Generate random derangement:
52
+
53
+ ```console
54
+ > uv run python -m latin_rectangles --n 42
55
+ 🎲 Generated Random Derangement for n=42
56
+ 📊 Cycle structure: [2, 2, 4, 8, 26]
57
+ 🔢 Number of extensions: 185,566,788,772,996,286,199,647,931,971,186,844,003,087,641,029,824
58
+ ```
59
+
60
+ Use specific cycle structure:
61
+
62
+ ```console
63
+ > uv run python -m latin_rectangles --c "2,2,4"
64
+ ⚙️ Specific Cycle Structure for n=8
65
+ 📊 Cycle structure: [2, 2, 4]
66
+ 🔢 Number of extensions: 4,744
67
+ ```
68
+
69
+ Enumerate all possible cycle structures:
70
+
71
+ ```console
72
+ > uv run python -m latin_rectangles --n 8 --all
73
+ 🔍 All Cycle Structures for n=8
74
+ 📊 Found 7 possible structures with non-zero extensions:
75
+
76
+ 1. [2, 2, 2, 2] → 4,752 extensions
77
+ 2. [2, 2, 4] → 4,744 extensions
78
+ 3. [2, 3, 3] → 4,740 extensions
79
+ 4. [2, 6] → 4,740 extensions
80
+ 5. [4, 4] → 4,740 extensions
81
+ 6. [3, 5] → 4,738 extensions
82
+ 7. [8] → 4,738 extensions
83
+ ```
84
+
85
+ ## Get help
86
+
87
+ ```console
88
+ uv run latin-rectangles --help
89
+ ```
90
+
91
+ ## Python Library Usage
92
+
93
+ ```python
94
+ from latin_rectangles import count_extensions, count_random_extensions
95
+ from latin_rectangles import generate_random_derangement
96
+
97
+ # Method 1: One-liner for random derangement
98
+ extensions = count_random_extensions(n=12)
99
+ print(f"Extensions: {extensions:,}")
100
+
101
+ # Method 2: Step-by-step with custom derangement
102
+ derangement = generate_random_derangement(n=10)
103
+ extensions = count_extensions(derangement)
104
+ print(f"Derangement {derangement[1:]} has {extensions:,} extensions")
105
+
106
+ # Method 3: With predefined derangement (1-indexed with dummy 0)
107
+ p = [0, 2, 3, 4, 5, 6, 7, 8, 1] # 8-cycle for n=8
108
+ extensions = count_extensions(p)
109
+ print(f"8-cycle has {extensions:,} extensions") # Output: 4,738
110
+ ```
111
+
112
+ ## Algorithm Details
113
+
114
+ ### Mathematical Foundation
115
+
116
+ The algorithm leverages **rook polynomial theory** to solve the Latin rectangle extension problem:
117
+
118
+ 1. **Input**: A derangement (permutation with no fixed points) representing the second row
119
+ 2. **Cycle Decomposition**: Decompose the derangement into disjoint cycles
120
+ 3. **Rook Polynomials**: Compute rook polynomial for each cycle structure
121
+ 4. **Polynomial Multiplication**: Combine rook polynomials to get the final count
122
+
123
+ ## API Reference
124
+
125
+ ### Core Functions
126
+
127
+ #### `count_extensions(permutation: list[int]) -> int`
128
+
129
+ Counts the number of extensions for a given derangement.
130
+
131
+ **Parameters:**
132
+
133
+ - `permutation`: 1-indexed list representing a derangement (p[0] is dummy value)
134
+
135
+ **Returns:** Integer number of possible third rows
136
+
137
+ **Raises:** `ValueError` if input is not a derangement
138
+
139
+ #### `count_random_extensions(n: int) -> int`
140
+
141
+ Convenience function that generates a random derangement and counts its extensions.
142
+
143
+ **Parameters:**
144
+
145
+ - `n`: Size of the derangement (must be > 1)
146
+
147
+ **Returns:** Number of extensions for the randomly generated derangement
148
+
149
+ #### `generate_random_derangement(n: int) -> list[int]`
150
+
151
+ Generates a random derangement of size n.
152
+
153
+ **Parameters:**
154
+
155
+ - `n`: Size of the derangement
156
+
157
+ **Returns:** 1-indexed list representing the derangement
158
+
159
+ #### `find_cycle_decomposition(permutation: list[int]) -> list[list[int]]`
160
+
161
+ Finds the cycle decomposition of a permutation.
162
+
163
+ **Parameters:**
164
+
165
+ - `permutation`: 1-indexed permutation
166
+
167
+ **Returns:** List of cycles (each cycle is a list of indices)
168
+
169
+ ## Examples
170
+
171
+ ### Basic Usage Examples
172
+
173
+ ```python
174
+ from latin_rectangles import count_extensions
175
+
176
+ # Example 1: Single 8-cycle
177
+ p_8_cycle = [0, 2, 3, 4, 5, 6, 7, 8, 1]
178
+ print(f"8-cycle: {count_extensions(p_8_cycle):,} extensions")
179
+ # Output: 8-cycle: 4,738 extensions
180
+
181
+ # Example 2: Two 4-cycles
182
+ p_4_4 = [0, 2, 3, 4, 1, 6, 7, 8, 5]
183
+ print(f"4,4-cycles: {count_extensions(p_4_4):,} extensions")
184
+ # Output: 4,4-cycles: 4,740 extensions
185
+
186
+ # Example 3: Four 2-cycles
187
+ p_2_2_2_2 = [0, 2, 1, 4, 3, 6, 5, 8, 7]
188
+ print(f"2,2,2,2-cycles: {count_extensions(p_2_2_2_2):,} extensions")
189
+ # Output: 2,2,2,2-cycles: 4,752 extensions
190
+ ```
191
+
192
+ ### Advanced Usage
193
+
194
+ ```python
195
+ from latin_rectangles import generate_random_derangement, find_cycle_decomposition, count_extensions
196
+
197
+ # Generate and analyze a random derangement
198
+ n = 15
199
+ derangement = generate_random_derangement(n)
200
+ cycles = find_cycle_decomposition(derangement)
201
+ cycle_lengths = sorted([len(c) for c in cycles])
202
+ extensions = count_extensions(derangement)
203
+
204
+ print(f"n={n}")
205
+ print(f"Derangement: {derangement[1:]}")
206
+ print(f"Cycle structure: {cycle_lengths}")
207
+ print(f"Extensions: {extensions:,}")
208
+ ```
209
+
210
+ ### Batch Processing
211
+
212
+ ```python
213
+ from latin_rectangles import count_random_extensions
214
+
215
+ # Process multiple sizes
216
+ results = []
217
+ for n in range(5, 21):
218
+ extensions = count_random_extensions(n)
219
+ results.append((n, extensions))
220
+ print(f"n={n:2d}: {extensions:,} extensions")
221
+
222
+ # Find the size with the most extensions in this batch
223
+ max_n, max_extensions = max(results, key=lambda x: x[1])
224
+ print(f"Maximum: n={max_n} with {max_extensions:,} extensions")
225
+ ```
226
+
227
+ ## Development
228
+
229
+ ### Running Tests
230
+
231
+ ```bash
232
+ # Run the test suite
233
+ uv run pytest
234
+
235
+ # Run with coverage
236
+ uv run pytest --cov=latin_rectangles
237
+
238
+ # Run specific test
239
+ uv run pytest tests/test_main.py -v
240
+ ```
241
+
242
+ ### Code Quality
243
+
244
+ ```bash
245
+ # Type checking
246
+ uv run mypy src/
247
+
248
+ # Linting
249
+ uv run ruff check src/
250
+
251
+ # Formatting
252
+ uv run ruff format src/
253
+ ```
254
+
255
+ ### Benchmarking
256
+
257
+ ```bash
258
+ # Run performance benchmarks
259
+ uv run python benchmark.py
260
+
261
+ # Analyze complexity
262
+ uv run python complexity_analysis.py
263
+ ```
264
+
265
+ ## Contributing
266
+
267
+ Contributions are welcome! Please see [DEVELOPMENT.md](DEVELOPMENT.md) for development guidelines.
268
+
269
+ 1. Fork the repository
270
+ 2. Create a feature branch
271
+ 3. Add tests for new functionality
272
+ 4. Ensure all tests pass
273
+ 5. Submit a pull request
274
+
275
+ ## License
276
+
277
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
278
+
279
+ ## Citation
280
+
281
+ If you use this library in your research, please cite:
282
+
283
+ ```bibtex
284
+ @software{latin_rectangles,
285
+ title={Latin Rectangles Extension Counter},
286
+ author={Ioannis Michaloliakos},
287
+ year={2025},
288
+ url={https://github.com/ionmich/latin-rectangles}
289
+ }
290
+ ```