# -*- coding: utf-8 -*-
"""
Created on Wed Apr 15 10:26:17 2026

@author: robin
"""

import sympy as sp

q = sp.Symbol('q') # Déclaration de la variable symbolique q

def qbin(u, v):

    if not v:
        return sp.Integer(1) # Cas de base 1 : v = epsilon (chaîne vide)

    if not u:
        return sp.Integer(0) # Cas de base 2 : u = epsilon (et v != epsilon, car géré au-dessus)

# Décomposition des mots : # u_prime correspond à 'u' dans la formule, 'a' à la dernière lettre, 
                           # v_prime correspond à 'v' dans la formule, 'b' à la dernière lettre
                           
    u_prime, a = u[:-1], u[-1]   
    v_prime, b = v[:-1], v[-1]

    # Terme 1 : qbin(u, vb) * q^{|vb|} (Ici 'vb' correspond à la variable v entière de notre fonction)

    terme_1 = qbin(u_prime, v)*(q**len(v))

    # Terme 2 : delta_{a, b} * qbin(u, v)
    
    # delta_{a, b} = 1
    
    if a == b:
        terme_2 = qbin(u_prime, v_prime)

    # delta_{a, b} = 0

    else:
        terme_2 = sp.Integer(0)

# On retourne la somme en développant le polynôme pour avoir un affichage propre

    return sp.expand(terme_1 + terme_2)