function [alpha,valfder]=val_derivee_multiple(i,X,Y)


%	val_derivee_multiple : sortie des valeurs des dérivées successives pour un support quelconque
%
% *********************************************************
%
%	[alpha,valfder]=val_derivee_multiple(i,X,Y)
%     sorties des valeurs des dérivées successives (définies dans Y)      
%     pour un support à n+1 points quelconque (ordonnée) stocké dans X,
%     pour un élément x_i de ce support.
%
%
%	variables d'entrées : 
%     * i : entier compris entre 0 et n
%     * X : contient les valeurs x_j, pour 0 <=j<=n (dans l'ordre croissant)
%     * Y : contient les valeurs f^(r)(x_j), pour 0 <=j<=n, de telle sorte que :
%             si x_k est multiple avec x_{k-1}~=x_k=x_{k+1}=...=x_{k+r}~=x_{k+r+1} alors
%                y_k=f(x_k), y_{k+1}=f'(x_k), ..., y_{k+r}=f^(r)(x_k).
%
%	variables de sortie
%     *  alpha : nombre d'éléments du n+1 uplet (x_0,x_1,...,x_n) égaux à x_i.     
%     *  valfder : vecteur ligne de longueur alpha tel que :
%                 pour tout l dans {0,...,alpha-1}; valfder(l+1)=f^{l}(x_i).
% 
% 
% ************ Fonctions auxiliaires utilisées ************
%
%       aucune
%
% *********************************************************
%


% Contrôles d'entrée
%
% nombre d'arguments
if nargin~=3
   error('nombre d''arguments de la fonction incorrect');
end
% taille des deux variables 
n=length(X)-1;
np=length(Y)-1;
if n~=np
   error('les deux tableaux n''ont pas la même taille');
end
% vérification de l'ordre croissant des x_i 
% (si X non formel)
if isnumeric(X)
   if max(abs(sort(X)-X))~=0
      error('support non ordonné');
   end
end
% vérification de l'appartenance de i à {0,...,n}
% vérification de l'ordre croissant des x_i 
if ~((0<=i) & (i<=n)) 
   error('le premier argument n''appartient pas à {0,...,n}');
end


% Corps d'algorithme
k=find(X==X(i+1));
alpha=length(k);
valfder=Y(k);