#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         C O N V E R S I O N   D ' U N   R A T I O N N E L   I R R E D U C T I B L E                                                 #
#         E N   U N   P O L Y N O M E   A   C O E F F I C I E N T S   E N T I E R S  :                                                #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#                   $xcg/RationnelPolynome.01$vv$Z          <Numerateur> <Denominateur>                                               #
#                                                                                                                                     #
#                                                                                                                                     #
#         Nota :                                                                                                                      #
#                                                                                                                                     #
#                     Voir 'v $xcg/PolynomeRationnel.01$vv$Z'                                                                         #
#                   pour effectuer la conversion inverse...                                                                           #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xcg/RationnelPolynome.01$vv$Z' :                                                                                #
#                                                                                                                                     #
#                     Jean-Francois Colonna (LACTAMME, 20200530140946).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

set       Numer=$1
set       Denom=$2

set       VNumer=`calculINS $Numer`
set       VDenom=`calculINS $Denom`

set       FauxPremier=1
                                        # On est oblige de tricher a cause de '$FACTO' qui ne factorise pas 1...                      #

if        (    ("$Numer" == "$VNumer")                                                                                                  \
          &&   ($VNumer >= $FauxPremier)                                                                                                \
           ) then
else
          EROR      "Le numerateur (=$Numer) doit etre entier et superieur ou egal a $FauxPremier."
          set       Numer=$FauxPremier
endif

if        (    ("$Denom" == "$VDenom")                                                                                                  \
          &&   ($VDenom >= $FauxPremier)                                                                                                \
           ) then
else
          EROR      "Le denominateur (=$Denom) doit etre entier et superieur ou egal a $FauxPremier."
          set       Denom=$FauxPremier
endif

set       PGCD=`$xcg/PGCD.01$X a=$Numer b=$Denom signe="$K_VIDE"`

if        ($PGCD == 1) then
          set       NoMbReN=`calculINS log($Numer)+2`
          set       NoMbReD=`calculINS log($Denom)+2`
          set       NoMbRe=`$xcg/MUL2.01$X x=$NoMbReN y=$NoMbReD signe="$K_VIDE" entier=VRAI`
                                        # Pour connaitre le nombre de nombres premiers utiles, on prend une grosse marge de           #
                                        # securite, le tout etant inspire de 'v $xil/defi_K2$vv$DEF LOIN'...                          #
                                        #                                                                                             #
                                        # Finalement, en faisant '$xcg/MUL2.01$X' plutot que '$xcg/MAX2.01$X', on prend une           #
                                        # grosse marge de securite...                                                                 #

          set       LNombresPremiers=`$xci/valeurs_Goldbach$X p=1 d=$NoMbRe editer_nombres_premiers=VRAI calculer_decompositions=FAUX`

          if   ($Numer == 1) then
               set  FactN="$FauxPremier^1+"
          else
               set  FactN=`$FACTO $Numer | $SE -e "s/^.*: *//" | $R "$K_BLANC" "$K_NL" | $UNI -c | $AW ' { print $2 "^" $1 "+"} '`
                                        # Factorisation du Numerateur.                                                                #
          endif

          if   ($Denom == 1) then
               set  FactD="$FauxPremier^1-"
          else
               set  FactD=`$FACTO $Denom | $SE -e "s/^.*: *//" | $R "$K_BLANC" "$K_NL" | $UNI -c | $AW ' { print $2 "^" $1 "-"} '`
                                        # Factorisation du Denominateur.                                                              #
          endif

          set       FactND=`echo "$FactN $FactD" | $R "$K_BLANC" "$K_NL" | $SOR -n | $SE -e 's/^\(.*\)\(.\)$/\2\1/'`
                                        # Factorisation de Numerateur/Denominateur avec donc a priori a la fois des exposants         #
                                        # positifs (venant du Numerateur) et negatifs (venant du Denominateur).                       #
          set       Dernier=`echo "$FactND[$#FactND]" | $SE -e "s/^.\([$Alphabet_0_9][$Alphabet_0_9]*\)[^$Alphabet_0_9].*"'$/\1/'`
                                        # Plus grand nombre premier utile.                                                            #

          set       Exposant=0
          set       Indice=1
          set       Polynome="$K_VIDE"

          set       A09="$Alphabet_0_9"

          foreach   NPrem ($LNombresPremiers)
          set       Present=`echo "$FactND" | $R "$K_BLANC" "$K_NL" | $EGRE "^.$NPrem""[^$A09]" | $SE -e "s/^\(.\)$NPrem""[^$A09]/\1/"`

                    if        ("$Present" != "$K_VIDE") then
                              set       Polynome="($Present""*X""^""$Exposant"")""+$Polynome"
                    else
                    endif

                    @         Exposant = $Exposant + 1
          end

          if        ("$Polynome" == "$K_VIDE") then
                    set       Polynome="0"
          else
          endif

          echo      "$Polynome"                                                                                                   |     \
          $SE       -e "s/^+//"                                                                                                         \
                    -e "s/\(+(\)+/\1/g"                                                                                                 \
                    -e "s/+\((\)\(-\)/\2\1/g"                                                                                           \
                    -e"s/^\((\)\(.\)/\2\1/g"                                                                                            \
                    -e "s/\((\)\([$Alphabet_0_9]*\*\)/\2\1/g"                                                                           \
                    -e "s/\([-+]\)1\*/\1/g"                                                                                             \
                    -e 's/+$//'                                                                                                         \
                    -e "s/(X\^0)/1/g"                                                                                                   \
                    -e "s/\([^$Alphabet_0_9][$Alphabet_0_9]*\)\*1"'$/\1/'                                                               \
                    -e "s+^+$Numer/$Denom ==> P(X) = +"
else
          EROR      "Le numerateur (=$Numer) et le denominateur (=$Denom) ne sont pas premiers entre-eux (PGCD=$PGCD)."
endif



Copyright © Jean-François Colonna, 2020-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2020-2021.