import math
[docs]def factor(n):
    """ Computes an irreducible factorization of a number.
    Parameter
    ----------
    n : int
        Number to factorize
    Returns
    ---------
    list:
        List of factors
    """
    f = lambda n: (p := [
        next(i for i in range(2, n + 1) if n % i == 0)] if n > 1 else []) + (
                      f(n // p[0]) if p else [])
    return f(n) 
[docs]def optimal_subplot_row_col(n_items):
    """ Computes the optimal arrangement of items in rows and columns.
    Parameter
    ----------
    n_items : int
        Number of items.
    Returns
    ---------
    int, int:
        Optimal number of rows and columns, respectively
    """
    f = factor(n_items)
    if len(f) == 1:
        f = factor(n_items - 1)
        m_ = round(len(f) / 2)
        sub_c = math.prod(f[:m_]) + 1
        sub_r = math.prod(f[m_:])
    else:
        m_ = round(len(f) / 2)
        sub_c = math.prod(f[:m_])
        sub_r = math.prod(f[m_:])
    return sub_r, sub_c