rithm 14.6.0

Arbitrary precision arithmetic.
Documentation
import pytest
from hypothesis import given

from rithm.integer import Int
from tests.utils import (
    IntOrBuiltin,
    IntWithBuiltin,
    equivalence,
    implication,
    is_equivalent_to_builtin_int,
)

from . import strategies


@given(strategies.ints, strategies.non_zero_ints_or_builtins)
def test_basic(dividend: Int, divisor: IntOrBuiltin) -> None:
    result = dividend % divisor

    assert isinstance(result, Int)


@given(strategies.ints, strategies.non_zero_ints)
def test_sign(dividend: Int, divisor: Int) -> None:
    result = dividend % divisor

    assert equivalence(result == 0, dividend / divisor == dividend // divisor)
    assert implication(result > 0, divisor > 0)


@given(strategies.ints, strategies.non_zero_ints)
def test_value(dividend: Int, divisor: Int) -> None:
    result = dividend % divisor

    assert abs(result) < abs(divisor)


@given(strategies.ints, strategies.non_zero_ints)
def test_alternatives(dividend: Int, divisor: Int) -> None:
    result = dividend % divisor

    assert result == dividend - (dividend // divisor) * divisor


@given(strategies.ints, strategies.ints_with_builtins)
def test_polymorphism(
    dividend: Int, divisor_with_builtin: IntWithBuiltin
) -> None:
    divisor, divisor_builtin = divisor_with_builtin

    try:
        result = dividend % divisor
    except ZeroDivisionError as exception:
        with pytest.raises(type(exception)):
            dividend % divisor_builtin
    else:
        assert result == dividend % divisor_builtin


@given(strategies.ints_with_builtins, strategies.ints_with_builtins)
def test_connection_with_builtin(
    dividend_with_builtin: IntWithBuiltin, divisor_with_builtin: IntWithBuiltin
) -> None:
    dividend, dividend_builtin = dividend_with_builtin
    divisor, divisor_builtin = divisor_with_builtin

    try:
        result = dividend % divisor
    except ZeroDivisionError as exception:
        with pytest.raises(type(exception)):
            dividend_builtin % divisor_builtin
    else:
        assert is_equivalent_to_builtin_int(
            result, dividend_builtin % divisor_builtin
        )


@given(strategies.ints, strategies.zero_ints_or_builtins)
def test_zero_divisor(dividend: Int, divisor: IntOrBuiltin) -> None:
    with pytest.raises(ZeroDivisionError):
        dividend % divisor