#!/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