:Addition de polynmes
<b>Input</b>: P = p_n x^n +...+ p_0 et Q = q_n x^n + ... + q_0 
    deux polynmes de degr n 
     coefficients dans un anneau R
<b>Output</b>: la somme P + Q
<b>pour</b> i = 0 <b></b> n <b>faire</b>
  w_i <-- p_i + q_i
<b>Retourner</b> w_n x^n + ... + w_O
n+1 additions dans R
O(T)
pour des polynmes  de degr infrieur   \(T\)


:Multiplication de polynmes
<b>Input</b>: P = p_n x^n +...+ p_0 et Q = q_t x^t + ... + q_0 deux polynmes 
    coefficients dans un anneau R
<b>Output</b>: le produit P * Q
<b>pour</b> k = 0 <b></b>  n + t <b>faire</b>
  w_k <-- 0
  <b>pour</b> i =  max(0, k - t) <b></b> min(n, k) <b>faire</b>
    w_k <-- w_k + p_i * q_{k - i}
<b>Retourner</b> w_{n + t} x^{n + t} + ... + w_0
(t+1)(n+1) additions et multiplications dans R
O(T^2)
pour des polynmes de degr infrieur  \(T\)


:Multiplication de polynmes
<b>Input</b>: P = p_n x^n +...+ p_0 et Q = q_t x^t + ... + q_0 deux polynmes 
    coefficients dans un anneau R
<b>Output</b>: le produit P + Q
<b>pour</b> i = 0 <b></b>  n <b>faire</b>
  R_i <-- p_i x^i * Q 
<b>Retourner</b> R_n + ... + R_0
(t+1)(n+1) additions et multiplications dans R
O(T^2)
pour des polynmes de degr infrieur  \(T\)


:Division euclidienne de polynmes
<b>Input</b>: A = a_n x^n +...+ a_0 et B = b_m x^m + ... + b_0 deux polynmes 
  de degr n  coefficients dans un anneau S, avec b_m une unit
<b>Output</b>: le quotient Q et R tel que A = Q B + R avec deg(R) < deg(B)
R <-- A
<b>pour</b> i = n-m <b></b> 0 <b>faire</b>
  <b>si</b> deg R = m + i <b>faire</b>
    q_i <-- coeff_dominant(R)/b_m <b>et</b> R <-- R - q_i x^i b
  <b>sinon</b> <b>faire</b>
    q_i <-- 0
  w_i <-- p_i + q_i  mod b
<b>Retourner</b> Q = q_{n-m} x^{n-m} + ... + q_O <b>et</b> R
O(T^2)
pour des polynmes  de degr infrieur   \(T\)


:Multiplication modulaire
<b>Input</b>: des entiers x et y infrieurs  un entier m
<b>Output</b>: le produit de x et de y modulo m
Calculer x*y 
Calculer le reste r de la division modulo m
<b>Retourner</b> r 
XX
O(T^2)
pour \(m\) de taille infrieure  \(T\)


:Elvation  la puissance
<b>Input</b>: un entier e et un lment g d'un groupe G commutatif
<b>Output</b>: calcule g^e
A <-- 1, S <-- g
<b>tant que </b> e != 0 <b>faire</b>
  <b>si</b> e est impair <b>faire</b>
    A <-- A.S
  e <-- quotient de e par 2
  <b>si</b> e != 0 <b>faire</b>
    S <-- S . S  
<b>Retourner</b> A
T(e) multiplications
O(T^3)
en oprations dans \(G\) pour \(e\) de taille infrieure  \(T\)


:PGCD algorithme d'Euclide
<b>Input</b>: A, B
<b>Output</b>: pgcd(A,B)
a <-- A, b <-- B
<b>tant que </b> b <> 0 <b>faire</b>
  t <-- b
  b <-- a mod b
  a <-- t
<b>Retourner</b> a
O(ln(A)ln(B)) oprations
O(T^2)
pour \(a\) et \(b\) de taille infrieure  \(T\)


:PGCD algorithme d'Euclide
<b>Input</b>: a, b
<b>Output</b>: pgcd2(a,b) le pgcd de a et b
<b>si</b> b = 0 <b>faire</b>
  <b>Retourner</b> a
<b>sinon</b> <b>faire</b>
  pgcd2(b, a mod b)
XX
O(T^2)
pour \(a\) et \(b\) de taille infrieure  \(T\)


:Algorithme d'Euclide
<b>Input</b>: a, b
<b>Output</b>: u et v tels que u a + v b = pgcd(a,b)
<b>si</b> a = 0 <b>faire</b>
  <b>Retourner</b> [b,0,1] 
x <-- a,  y <-- b,  vx <-- 0,  vy <-- 1
<b>tant que </b> y <> 0 <b>faire</b>
  q <-- quotient de x par y, r <-- x-q*y
  t <-- vy
  vy <-- vx - q*vy
  vx <-- t
  x <-- y
  y <-- r
<b>Retourner</b> [x, (x-b*vx)/a, vx];
XX
O(T^2)
pour \(a\) et \(b\) de taille infrieure  \(T\)


:Algorithme d'Euclide
<b>Input</b>: a, b deux polynmes  coefficients dans un corps R
<b>Output</b>: u et v tels que u a + v b = pgcd(a,b)
<b>si</b> a = 0 <b>faire</b>
  <b>Retourner</b> [b,0,1] 
x <-- a,  y <-- b,  vx <-- 0,  vy <-- 1
<b>tant que </b> y <> 0 <b>faire</b>
  q <-- quotient de x par y, r <-- x-q*y
  t <-- vy
  vy <-- vx - q*vy
  vx <-- t
  x <-- y
  y <-- r
<b>Retourner</b> [x, (x-b*vx)/a, vx];
XX
O(T^2)
en oprations dans \(R\) pour \(a\) et \(b\) de taille infrieure  \(T\)


:Multiplication de polynmes de degr n
<b>Input</b>: A = a_k* x^k + ... + a_0 et  B = b_l* x^{l-1} + ... + b_0
<b>Output</b>: A * B
<b>pour</b>  i = 0 <b></b> k + l <b>faire</b>
  c_i <-- 0
<b>pour</b>  i = 0 <b></b> k <b>faire</b>
  <b>pour</b>  j = 0 <b></b> l <b>faire</b>
    c_{i+j} <-- c_{i+j} + a_i * b_j
<b>Retourner</b> c_{k+l}* x^{k+l} + ... + c_0
XX
O(T^2)
en oprations dans l'anneau des coefficients lorsque les polynmes sont de degr infrieur  \(T\)


:Division de polynmes de degr n
<b>Input</b>: A = a_{k-1}*x^{k-1} + ... + a_0 et  B = b_{l-1}*x^{l-1} + ... + b_0 
    avec l <= k et b_{l-1} unit
<b>Output</b>: polynmes Q et R tel que A = QB + R avec deg(R) < deg(B)
t <-- b_{l-1}^{-1}
<b>pour</b>  i = 0 <b></b> k -1 <b>faire</b>
  r_i <-- a_i
<b>pour</b>  i = k - l  <b></b> 0 en dcroissant <b>faire</b>
  q_i <-- t*r_{i+l-1}
  <b>pour</b>  j = 0 <b></b> l - 1 <b>faire</b>
    r_{i+j} <-- r_{i+j} - q_i*b_j
<b>Retourner</b> q_{k-l}* x^{k-l} + ... + q_0,  r_{l-2}* x^{l-2} + ... + r_0
O(len(A)len(Q))
O(T^2)
en oprations dans l'anneau des coefficients lorsque les polynmes sont de degr infrieur  \(T\)


:Evaluation d'un polynme de degr n par la mthode d'Horner
<b>Input</b>: A = a_k*x^k + ... + a_0  et r dans un anneau R 
      contenant les coefficients de A
<b>Output</b>: A(r) dans R
s <-- 0
<b>pour</b> i = k <b></b> 0 en dcroissant <b>faire</b>
  s <-- s + r * a_i
<b>Retourner</b> s
k additions et k multiplications
O(T)
en oprations dans R lorsque le polynme est de degr infrieur  \(T\)


:Evaluation d'un polynme de degr n
<b>Input</b>: A = a_k* x^k + ... + a_0  et r dans un anneau R 
     contenant les coefficients
<b>Output</b>: A(r) dans R
s <-- 0
v <-- 1
<b>pour</b> i = 0 <b></b> k <b>faire</b>
  s <-- s + a_i * v
  v <-- v * r
<b>Retourner</b> s
k additions et 2k multiplications
O(T)
en oprations dans R lorsque le polynme est de degr infrieur  \(T\)


:Lemme chinois
<b>Input</b>: des entiers m_1, ... , m_r, premiers entre eux deux  deux 
  et a_1, ... , a_r 
<b>Output</b>: l'entier n infrieur au produit des m_i congru  a_i modulo m_i
m <-- m_1 ... m_r
c <-- 0
<b>pour</b> i = 1 <b></b> r <b>faire</b>
  M <-- m/m_i
  calculer s_i et t_i tel que  s_iM + t_i m_i = 1 
  en appelant la procdure Euclide tendu
  c_i <-- a_i * s_i mod m_i
  c <-- c + c_i*M
<b>Retourner</b> c mod m 
cot de la multiplication de r entiers 
O(T^2)
pour des entiers \(m_i\) de taille infrieure  \(T\) (\(r\) fix)


:Interpolation de Lagrange par un polynme
<b>Input</b>: u_1, ... , u_r, v_1, ... , v_r dans un corps R
<b>Output</b>: le polynme P d'interpolation de Lagrange
P <-- 0
<b>pour</b> i = 1 <b></b> r <b>faire</b>
  m_i <-- x - u_i
m <-- m_1
<b>pour</b> i = 2 <b></b> r <b>faire</b>
  m <-- m * m_i
<b>pour</b> i = 1 <b></b> r <b>faire</b>
  M <-- m/m_i
  r <--  valuation de  M en u_i
  M <-- M_i/r
  P <-- P + M
<b>Retourner</b> P
cot de la multiplication de r entiers 
O(T^2)
en oprations dans \(R\) pour \(r\) infrieur  \(T\)


:Multiplication de polynmes (Karatsuba)
<b>Input</b>: P et Q deux polynmes dans R[x] 
   de degr infrieur  n = 2^k
<b>Output</b>: Prod(P, Q) le produit P * Q
<b>si</b> n = 1 <b>faire</b>
  <b>Retourner</b> f * g dans R
Ecrire P = P_1 x^{n/2} + P_0 <b>et</b> Q = Q_1 x^{n/2} + Q_0
   avec P_0, P_1, Q_0, Q_1 de degr infrieur  n/2
F_1 <-- Prod(P_1,Q_1)
F_0 <-- Prod(P_0,Q_0)
F_2 <-- Prod(P_0 + P_1, Q_0 + Q_1)
<b>Retourner</b> F_1 * x^n + (F_2 - F_0 - F_1) * x^{n/2} + F_0
XX
O(T^{\log_2 3)}
pour des polynmes de degr infrieur  \(T\)


:Tri Bulle
<b>Input</b>: tableau de n entiers
<b>Output</b>: trie le tableau A par ordre croissant
<b>pour</b> i = 1 <b></b> n - 1 <b>faire</b>
  <b>pour</b> j = n  <b></b> i + 1 en descendant <b>faire</b>
    <b>si</b> A[j-1] > A[j] <b>faire</b>
      changer A[j-1] et A[j]
      temp  <--  A[j-1]; A[j-1] <-- A[j]; A[j] <-- temp;
<b>Retourner</b> A
\(n(n-1)/2\) passages  l'intrieur des boucles.
O(T^2)
pour une liste de taille \(n\) infrieure  \(T\)


