
    gU                     p    d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	  G d de          Z
d	 Zd
 Zd ZdS )z
The Schur number S(k) is the largest integer n for which the interval [1,n]
can be partitioned into k sum-free sets.(https://mathworld.wolfram.com/SchurNumber.html)
    N)S)Basic)Function)Integerc                   .    e Zd ZdZed             Zd ZdS )SchurNumbera\  
    This function creates a SchurNumber object
    which is evaluated for `k \le 5` otherwise only
    the lower bound information can be retrieved.

    Examples
    ========

    >>> from sympy.combinatorics.schur_number import SchurNumber

    Since S(3) = 13, hence the output is a number
    >>> SchurNumber(3)
    13

    We do not know the Schur number for values greater than 5, hence
    only the object is returned
    >>> SchurNumber(6)
    SchurNumber(6)

    Now, the lower bound information can be retrieved using lower_bound()
    method
    >>> SchurNumber(6).lower_bound()
    536

    c                     |j         rm|t          j        u rt          j        S |j        rt          j        S |j        r|j        rt          d          dddddd}|dk    rt          ||                   S d S d S )	Nzk should be a positive integer         ,      )r
         r      r   )		is_Numberr   Infinityis_zeroZero
is_integeris_negative
ValueErrorr   )clskfirst_known_schur_numberss      \/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/combinatorics/schur_number.pyevalzSchurNumber.eval'   s    ; 		=AJz!y v< C1= C !ABBB,-!rc(J(J%Avv8;<<<		= 		= v    c                     | j         d         }|dk    rt          d          S |dk    rt          d          S |j        r0d|                     |dz
                                            z  dz
  S d|z  dz
  dz  S )	Nr      i     i  r   r
   r   )argsr   
is_Integerfunclower_bound)selff_s     r   r%   zSchurNumber.lower_bound4   s    Yq\773<<774== = 	9TYYrAv&&22444q882	1}r   N)__name__
__module____qualname____doc__classmethodr   r%    r   r   r   r      sH         4 
= 
= [
=
 
 
 
 
r   r   c                     | t           j        u rt          d          | dk    rt          d          | dk    rd}n-t          j        t          j        d| z  dz   d                    }t          |          S )NzInput must be finiter   z&n must be a non-zero positive integer.r   r
   r   )r   r   r   mathceillogr   )nmin_ks     r   _schur_subsets_numberr4   A   ss    AJ/000AvvABBB	
a	$(1Q37A..//5>>r   c                    t          | t                    r| j        st          d          t	          |           }| dk    rdgg}n | dk    rddgg}n| dk    rg dg}nddgddgg}t          |          |k     rct          ||           }d t          t          |          | dz
  dz  dz             D             }|dxx         |z  cc<   t          |          |k     c|S )	a  

    This function returns the partition in the minimum number of sum-free subsets
    according to the lower bound given by the Schur Number.

    Parameters
    ==========

    n: a number
        n is the upper limit of the range [1, n] for which we need to find and
        return the minimum number of free subsets according to the lower bound
        of schur number

    Returns
    =======

    List of lists
        List of the minimum number of sum-free subsets

    Notes
    =====

    It is possible for some n to make the partition into less
    subsets since the only known Schur numbers are:
    S(1) = 1, S(2) = 4, S(3) = 13, S(4) = 44.
    e.g for n = 44 the lower bound from the function above is 5 subsets but it has been proven
    that can be done with 4 subsets.

    Examples
    ========

    For n = 1, 2, 3 the answer is the set itself

    >>> from sympy.combinatorics.schur_number import schur_partition
    >>> schur_partition(2)
    [[1, 2]]

    For n > 3, the answer is the minimum number of sum-free subsets:

    >>> schur_partition(5)
    [[3, 2], [5], [1, 4]]

    >>> schur_partition(8)
    [[3, 2], [6, 5, 8], [1, 4, 7]]
    zInput value must be a numberr
   r   r   )r
   r   r   r   c                     g | ]
}d |z  dz   S r   r
   r-   ).0r   s     r   
<listcomp>z#schur_partition.<locals>.<listcomp>   s     WWWq1Q37WWWr   )
isinstancer   r   r   r4   len_generate_next_listrange)r2   number_of_subsetssum_free_subsetsmissed_elementss       r   schur_partitionrB   O   s+   ^ !U 9AK 97888-a00AvvC5	
aF8	
a%II;FQF+


"3
3
3./?CCWWE#6F2G2G!A#PQTU,V,VWWW/ 

"3
3
3
 r   c                    g }| D ]8}fd|D             }fd|D             }||z   }|                     |           9fdt          t          |           dz             D             }|                     |           |} | S )Nc                 ,    g | ]}|d z  k    |d z  S )r   r-   r8   numberr2   s     r   r9   z'_generate_next_list.<locals>.<listcomp>   s&    ???vQ&(r   c                 8    g | ]}|d z  dz
  k    |d z  dz
  S r7   r-   rE   s     r   r9   z'_generate_next_list.<locals>.<listcomp>   s3    GGG6VAX\Q5F5F&(Q,5F5F5Fr   c                 8    g | ]}d |z  dz   k    d |z  dz   S r7   r-   )r8   r   r2   s     r   r9   z'_generate_next_list.<locals>.<listcomp>   s.    MMMQ!a11qr   r
   )appendr>   r<   )current_listr2   new_listitemtemp_1temp_2new_item	last_lists    `      r   r=   r=      s    H " "???????GGGGTGGGF?!!!!MMMM%L(9(9!(;"<"<MMMIOOILr   )r+   r/   
sympy.corer   sympy.core.basicr   sympy.core.functionr   sympy.core.numbersr   r   r4   rB   r=   r-   r   r   <module>rU      s            " " " " " " ( ( ( ( ( ( & & & & & &2 2 2 2 2( 2 2 2j  A A AH    r   