Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 971
Réponses : 3
Type : discussion
Etat : réponses autorisées

Code Reed-Solomon.

ld le 16/12/2014 à 14:11
Tout est expliqué à cette adresse :
https://fr.wikipedia.org/wiki/Code_de_Reed-Solomon

En gros, avec ce prgm, si je vous donne une liste de nombres aussi longue soit elle, du genre :
[89 56 84 743 645 46 74 85 4 56 71 509 58 674 45 12 94 98 46 3 234]
ou encore :
[01010101100011000110010101010110101010101010]

Avec la clef de vérification que je vous donne, le prgm pourra corriger pour vous une erreur de recopiage.

On peut aussi adapter le prgm pour qu'il fonctionne avec des chaînes...

Entrez dans L1 la liste que vous voulez vérifier ou don vous voulez avoir la clef (composée de deux nombres).
Si il y a une erreur elle sera corrigée toute seule et la nouvelle valeur affichée.

EDIT prgm RSOLOMON V2 152 octets.
Code
:0->R

:For(N,1,dim(L1
:R+NL1(N->R
:End

:somme(L1->S
:Input "1/CLEF 2/VERIF ",M

:If M=1:Then:Disp S,R:Stop:End

:Prompt A,B
:If S=A et B=R:Stop
:S-A->S
:(R-B)/S->M
:Disp "ERR LIGNE",M,"VALEUR"
:L1(M)-S->L1(M
linkakro le 16/12/2014 à 22:58
Intéressant.

(Comment gérer une erreur dans le code de correction ? Le code lui même est transmis avec le message dans les applications de communication.)

Suggestions d'optimisation et autre.
Je veux calculer la somme pondérée sans boucle.
Je préfère les menus aux invités bien que toi tu en mettes partout depuis toujours.
Je préfère quelques alternatives plutôt que des Stop. Return plutôt que Stop permet de revenir à un programme parent s'il y en a un.
tu utilises ces stop mais cela ne te permet pas spécialement de placer quelque chose stratégiquement sur la dernière ligne pour affichage, or je ne vois pas d'autre intérêt.
Je pense utile d'afficher la position de l'erreur. Afficher la liste est faisable aussi.
Code
somme(L1suite(N,N,1,dim(L1->R // simple suggestion facultative
 // ou pour Mathprint : Sigma(NL1(N),N,1,dim(L1->R
:somme(L1->S
:Menu("","CLE",1,"VERIF",2 // simplement ma préférence
:Lbl 1
:Disp S,R
:Return
:Lbl 2
:Prompt A,B
:If S-A ou B-R
:Then
:Disp "ERREUR"
:S-A->S
:R-B->R
:L1(R/S)-S->L1(R/S)
:Disp R/S
:L1(R/S  // j'omets le End pour profiter de la dernière ligne
ld le 16/12/2014 à 23:05
"une erreur dans le code de correction"
C'était la question existentielle de trop. Le temps va s'arrêter et l'univers va s’effondrer sur lui même. C'EST LA FIN LES MECS ! ONT VA TOUS MOURIR !! laugh.gif laugh.gif
Oui bah là il faut demander aux mathématiciens qui ont inventer çà !
Mais apparemment ont s'en sert pour pas mal de choses: téléphonie, Adsl, fichier image, QR code, CD, DVD (même codé 2 fois d'affilé paraît'il !)

La réponse est sur Wiki:
"Si plus de 8 octets sont détectés comme erronés, le bloc de données utiles est marqué comme défectueux. Aucune erreur n'est alors corrigée"
Et c'est forcément se qui se produit si la clef est fausse.
linkakro le 17/12/2014 à 00:25
Oui les codes de checksum et correcteurs sont beaucoup utilisés. winkle.gif
Hélas je n'entend parler que du CRC à cause d'ethernet, bien que ce ne soit pas le seul protocole. winkle.gif (remarques: crc ne permet pas de corriger, mais il est extrêmement performant pour détecter des erreurs. Ce n'est pas le même objectif.)