تصحيح خطأ ريد-سولومون

في نظرية المعلومات ونظرية الترميز، تُعد **رموز ريد–سولومون** مجموعة من رموز تصحيح الأخطاء التي قدمها إيرفينج إس. ريد وجوستاف سولومون في عام 1960. لها العديد من التطبيقات، بما في ذلك تقنيات المستهلك مثل ، والأقراص المضغوطة، وأقراص دي في دي، وأقراص بلو راي، ورموز الاستجابة السريعة، ومصفوفة البيانات، وتقنيات نقل البيانات مثل الخط المشترك الرقمي وواي ماكس، وأنظمة البث مثل الاتصالات عبر الأقمار الصناعية، و بي في دي وهيئة أنظمة التلفزيون المتطورة، وأنظمة التخزين مثل ريد 6.

تعمل أكواد ريد–سولومون على كتلة من البيانات يتم التعامل معها كمجموعة من عناصر المجال المحدود تسمى الرموز. تتمتع رموز ريد–سولومون بالقدرة على اكتشاف أخطاء الرموز المتعددة وتصحيحها. من خلال إضافة رموز التحقق  إلى البيانات، يمكن لكود ريد–سولومون اكتشاف (ولكن ليس تصحيح) أي مجموعة من الرموز الخاطئة حتى **'، ''أو'' تحديد وتصحيح ما يصل إلى  من الرموز الخاطئة في مواقع غير معروفة. باعتباره ، فإنه يمكنه تصحيح ما يصل إلى **' عمليات مسح في المواقع المعروفة والمقدمة للخوارزمية، أو يمكنه اكتشاف وتصحيح مجموعات من الأخطاء والمسح. تعتبر أكواد ريد–سولومون مناسبة أيضًا كأكواد تصحيح أخطاء البتات متعددة الانفجارات، حيث أن تسلسل يمكن أن يؤثر خطأ بت  متتالي على رمزين بحجم **' كحد أقصى. يعود اختيار **' إلى مصمم الكود، ويمكن تحديده ضمن حدود واسعة.

هناك نوعان أساسيان من رموز ريد–سولومونالعرض الأصلي وعرض بي سي إتشمع كون عرض بي سي إتش هو الأكثر شيوعًا، حيث أن فك تشفير عرض بي سي إتش أسرع ويتطلب مساحة تخزين عمل أقل من فك تشفير العرض الأصلي.

## التاريخ
تم تطوير رموز ريد–سولومون في عام 1960 من قبل إيرفينج إس. ريد وجوستاف سولومون، اللذين كانا آنذاك من أعضاء هيئة التدريس في مختبر لينكولن التابع لمعهد ماساتشوستس للتكنولوجيا. كان عنوان مقالهم الرائد «الرموز متعددة الحدود على حقول محدودة معينة». استخدم مخطط الترميز الأصلي الموصوف في مقال ريد وسولومون متعدد الحدود المتغير استنادًا إلى الرسالة التي يجب ترميزها حيث تكون مجموعة ثابتة فقط من القيم (نقاط التقييم) التي يجب ترميزها معروفة للمشفر وفك التشفير. قام فك التشفير النظري الأصلي بإنشاء كثيرات حدود محتملة استنادًا إلى مجموعات فرعية من *k* (طول الرسالة غير المشفرة) من بين *n* (طول الرسالة المشفرة) من قيم الرسالة المستلمة، واختيار كثير الحدود الأكثر شيوعًا باعتباره الصحيح، وهو ما كان غير عملي في جميع الحالات باستثناء أبسطها. تم حل هذه المشكلة في البداية عن طريق تغيير المخطط الأصلي إلى مخطط يشبه رمز بي سي إتش يعتمد على كثير حدود ثابت معروف لكل من المشفر وفك التشفير، ولكن في وقت لاحق، تم تطوير أجهزة فك تشفير عملية تعتمد على المخطط الأصلي، على الرغم من أنها أبطأ من مخططات بي سي إتش. النتيجة هي وجود نوعين رئيسيين من رموز ريد–سولومون: تلك التي تستخدم مخطط الترميز الأصلي وتلك التي تستخدم مخطط ترميز بي سي إتش.

في عام 1960 أيضًا، تم وصف فك تشفير متعدد الحدود عملي ثابت لرموز بي سي إتش الذي طوره دانييل جورنشتاين ونيل زيرلر في تقرير صادر عن مختبر لينكولن التابع لمعهد ماساتشوستس للتكنولوجيا بواسطة زيرلر في يناير 1960 وفي وقت لاحق في مقال في يونيو 1961. تم وصف فك تشفير جورنشتاين-زيرلر والعمل المرتبط به على رموز بي سي إتش في كتاب «رموز تصحيح الأخطاء» بقلم و. ويزلي بيترسون (1961). بحلول عام 1963 (أو ربما قبل ذلك)، كان جيه جيه ستون (وآخرون) أدرك أن رموز ريد–سولومون يمكنها استخدام مخطط بي سي إتش باستخدام متعدد الحدود المولد الثابت، مما يجعل مثل هذه الرموز فئة خاصة من رموز بي سي إتش، ولكن رموز ريد–سولومون المستندة إلى مخطط الترميز الأصلي ليست فئة من رموز بي سي إتش، واعتمادًا على مجموعة نقاط التقييم، فهي ليست حتى .

في عام 1969، تم تطوير فك تشفير مخطط بي سي إتش المحسن بواسطة إلوين بيرليكامب وجيمس ماسي ومنذ ذلك الحين أصبح يُعرف باسم .

في عام 1975، تم تطوير فك تشفير مخطط بي سي إتش محسن آخر بواسطة ياسو سوجياما، استنادًا إلى خوارزمية إقليدية موسعة.

تصغير|350px

في عام 1977، تم تنفيذ أكواد ريد–سولومون في برنامج فوييجر في شكل . ظهر أول تطبيق تجاري في المنتجات الاستهلاكية المنتجة بكميات كبيرة في عام 1982 مع القرص المضغوط، حيث تم استخدام رمزين متداخلين من نوع ريد–سولومون. اليوم، يتم تنفيذ أكواد ريد–سولومون على نطاق واسع في أجهزة التخزين الرقمية ومعايير الاتصالات الرقمية، على الرغم من استبدالها ببطء بأكواد بوز-تشودهوري-هوكوينغيم (بي سي إتش). على سبيل المثال، يتم استخدام رموز ريد–سولومون في معيار البث الرقمي للفيديو (بي في دي) معيار بث الفيديو الرقمي فضائيا، بالاشتراك مع رمز داخلي ملتف، ولكن يتم استخدام رموز بي سي إتش مع  في خليفته، معيار بي في دي-إس2.

في عام 1986، تم تطوير فك تشفير المخطط الأصلي المعروف باسم .

في عام 1996، تم تطوير أشكال مختلفة من أجهزة فك التشفير الأصلية والتي تسمى أجهزة فك التشفير القائمة أو أجهزة فك التشفير الناعمة بواسطة مادو سودان وآخرين، ويستمر العمل على هذه الأنواع من أجهزة فك التشفير (انظر ).

في عام 2002، تم تطوير فك تشفير مخطط أصلي آخر بواسطة شوهونج جاو، استنادًا إلى خوارزمية إقليدية ممتدة.

## التطبيقات

### تخزين البيانات
يتم استخدام تشفير ريد–سولومون على نطاق واسع في أنظمة التخزين الشامل لتصحيح أخطاء الانفجار المرتبطة بعيوب الوسائط.

يعتبر تشفير ريد–سولومون أحد المكونات الأساسية للقرص المضغوط. كان هذا أول استخدام لترميز تصحيح الأخطاء القوي في منتج استهلاكي يتم إنتاجه بكميات كبيرة، وتستخدم دات ودي في دي مخططات مماثلة. في القرص المضغوط، يتم فصل طبقتين من ترميز ريد–سولومون بواسطة متداخل ملتف ذي 28 اتجاهًا مما ينتج عنه مخطط يسمى ترميز ريد–سولومون المتداخل المتقاطع (). العنصر الأول في فك تشفير ترميز ريد–سولومون المتداخل هو رمز ريد–سولومون الداخلي الضعيف نسبيًا (32،28)، والذي تم اختصاره من رمز (255،251) برموز مكونة من 8 بت. يمكن لهذا الكود تصحيح أخطاء تصل إلى 2 بايت لكل كتلة مكونة من 32 بايت. والأمر الأكثر أهمية هو أنه يقوم بتمييز أي كتل غير قابلة للتصحيح على أنها محذوفة، أي الكتل التي تحتوي على أخطاء أكبر من 2 بايت. يتم بعد ذلك نشر الكتل المفكوكة المكونة من 28 بايتًا، مع مؤشرات المسح، بواسطة مزيل التداخل إلى كتل مختلفة من الكود الخارجي (28،24). بفضل إزالة التداخل، تصبح كتلة ممسوحة مكونة من 28 بايتًا من الكود الداخلي بايتًا ممسوحًا واحدًا في كل كتلة من كتل الكود الخارجية البالغ عددها 28 بايتًا. يقوم الكود الخارجي بتصحيح هذه المشكلة بسهولة، لأنه يمكنه التعامل مع ما يصل إلى 4 عمليات مسح من هذا القبيل لكل كتلة.

النتيجة هي ترميز ريد–سولومون المتداخل الذي يمكنه تصحيح أخطاء تصل إلى 4000 بت، أو حوالي 2.5&nbsp;ملم على سطح القرص. هذا الكود قوي جدًا لدرجة أن معظم أخطاء تشغيل الأقراص المضغوطة ناجمة على الأرجح عن أخطاء التتبع التي تتسبب في خروج الليزر عن المسار، وليس عن طريق انفجارات الأخطاء غير القابلة للتصحيح.

تستخدم أقراص دي في دي مخططًا مشابهًا، ولكن مع كتل أكبر بكثير، وكود داخلي (208,192)، وكود خارجي (182,172).

يتم استخدام تصحيح خطأ ريد–سولومون أيضًا في ملفات بارشيف والتي يتم نشرها عادةً مع ملفات الوسائط المتعددة على يوزنت. كما استخدمت خدمة التخزين عبر الإنترنت الموزعة ووالا (التي تم إيقافها في عام 2015) أيضًا ريد–سولومون عند تقسيم الملفات.

### الرمز الشريطي
تستخدم جميع الرموز الشريطية ثنائية الأبعاد تقريبًا مثل بي دي إف-417 و ورمز مصفوفي ورمز استجابة سريعة و  تصحيح خطأ ريد–سولومون للسماح بالقراءة الصحيحة حتى في حالة تلف جزء من الرمز الشريطي. عندما لا يتمكن ماسح الباركود من التعرف على رمز الباركود، فسوف يعامله على أنه مسح.

يعد ترميز ريد–سولومون أقل شيوعًا في الرموز الشريطية أحادية البعد، ولكن يتم استخدامه بواسطة رمزية .

### نقل البيانات
يمكن استخدام الأشكال المتخصصة من رموز ريد–سولومون، وتحديدًا كوشي-آر إس و فاندرموند-آر إس، للتغلب على الطبيعة غير الموثوقة لنقل البيانات عبر قنوات المسح. تفترض عملية الترميز رمز آر إس (*N*،&nbsp;*K*) مما يؤدي إلى إنشاء *N* كلمة رمزية بطول *N* رمز، كل منها يخزن *K* رمزًا من البيانات، والتي يتم إرسالها بعد ذلك عبر قناة مسح.

إن أي مجموعة من الكلمات الرمزية *(K)* التي تم تلقيها في الطرف الآخر تكون كافية لإعادة بناء كل الكلمات الرمزية *(N)*. يتم عادةً ضبط معدل الترميز على 1/2 ما لم يكن من الممكن نمذجة احتمالية محو القناة بشكل مناسب ورؤيتها أقل. في الختام، يكون *N* عادةً 2 *K*، مما يعني أنه يجب استلام نصف جميع كلمات المرور المرسلة على الأقل من أجل إعادة بناء جميع كلمات المرور المرسلة.

تُستخدم أكواد ريد–سولومون أيضًا في أنظمة الخط المشترك الرقمي  الخاصة بـ سي سي إس دي إس كشكل من أشكال تصحيح الأخطاء الأمامية.

### النقل الفضائي

[350px|تصغير| نظام ترميز متسلسل في الفضاء العميق. التدوين: آر إس (255، 223) + [Convolutional codes|سي سي («طول القيد» = 7، معدل الترميز = 1/2).]]

كان أحد التطبيقات المهمة لتشفير ريد–سولومون هو تشفير الصور الرقمية التي أرسلها برنامج فوييجر.

قدمت مركبة فوييجر تشفير ريد–سولومون المترابط مع ، وهي ممارسة أصبحت منذ ذلك الحين منتشرة على نطاق واسع في الفضاء العميق والاتصالات عبر الأقمار الصناعية (على سبيل المثال، البث الرقمي المباشر).

تميل  إلى إنتاج أخطاء في دفعات قصيرة. إن تصحيح أخطاء الانفجار هذه هو المهمة التي يمكن إنجازها على أفضل وجه باستخدام أكواد ريد–سولومون القصيرة أو المبسطة.

كانت الإصدارات الحديثة من الترميز التلافيفي المتسلسل المفكوك بواسطة ريد–سولومون/فيتربي تُستخدم ولا تزال تُستخدم في بعثات مارس باثفايندر، وجاليليو، ومركبة استكشاف المريخ، وكاسيني، حيث تعمل ضمن حوالي 1-1.5 ديسيبل من الحد الأقصى، وهو سعة شانون.

يتم الآن استبدال هذه الرموز المتسلسلة  أكثر قوة:

## الإنشاءات (الترميز)

إن شفرة ريد–سولومون هي في الواقع عائلة من الشفرات، حيث يتميز كل شفرة بثلاثة معلمات: حجم الأبجدية **'، [[Block code|وطول الكتلة]] **'، وطول الرسالة **'، مع <math>k < n \leq q</math>. يتم تفسير مجموعة رموز الأبجدية على أنها [[حقل محدود (رياضيات)|الحقل المحدود]] <math>F</math> من أجل <math>q</math>، وبالتالي، <math>q</math> يجب أن تكون [[قوة عدد أولي|قوة رئيسية]]. في أكثر معلمات كود ريد–سولومون فائدة، يكون طول الكتلة عادةً مضاعفًا ثابتًا لطول الرسالة، أي [[Block code|المعدل]] <math>R = \frac{k}{n}</math> هو ثابت ما، وعلاوة على ذلك، فإن طول الكتلة إما أن يكون مساويًا لحجم الأبجدية أو أقل منه بواحد، أي، <math>n=q</math> أو <math>n=q-1</math>.

=== وجهة النظر الأصلية لريد وسولومون: الكلمة الرمزية كسلسلة من القيم ===
توجد إجراءات ترميز مختلفة لرمز ريد–سولومون، وبالتالي، توجد طرق مختلفة لوصف مجموعة كل الكلمات الرمزية. في العرض الأصلي لريد وسولومون، كل كلمة رمزية من رمز ريد–سولومون هي عبارة عن تسلسل من قيم الدالة لكثيرة حدود من الدرجة الأقل من <math>k</math>. من أجل الحصول على كلمة رمزية لرمز ريد–سولومون، يتم التعامل مع رموز الرسائل (كل منها ضمن الأبجدية بحجم q) كمعاملات لكثيرة حدود <math>p</math> من الدرجة أقل من <math>k</math>، فوق المجال المحدود <math>F</math> مع <math>q</math> عناصر. وبدوره، فإن كثيرة الحدود <math>p</math> يتم تقييمه في <math>n \leq q</math> نقاط مميزة <math>a_1, \dots, a_n</math> من الميدان <math>F</math>، وتسلسل القيم هو الكلمة الرمزية المقابلة. تتضمن الاختيارات الشائعة لمجموعة من نقاط التقييم ما يلي: <math>\{ 0, 1, 2, \dots, n - 1 \}</math>، <math>\{0, 1, \alpha, \alpha^2, \dots, \alpha^{n-2} \}</math>، أو ل <math>n < q</math>، <math>\{1, \alpha, \alpha^2, \dots, \alpha^{n-1} \}</math>،...، أين <math>\alpha</math> هو  من <math>F</math>.

رسميا، المجموعة <math>\mathbf{C}</math> يتم تعريف كلمات رمز ريد–سولومون على النحو التالي: <math display="block">
\mathbf{C}
 = \Bigl\{\;
   \bigl( p(a_1), p(a_2), \dots, p(a_n) \bigr)
   \;\Big|\;
   p \text{ is a polynomial over } F \text{ of degree } <k
  \;\Bigr\}\,.
</math> نظرًا لأن أي حدودين ''مختلفتين'' بدرجة أقل من <math>k</math> أتفق على الأكثر <math>k-1</math> النقاط، وهذا يعني أن أي كلمتين رمزيتين من قانون ريد–سولومون تختلفان في ما لا يقل عن <math>n - (k-1) = n-k+1</math> المواقف. علاوة على ذلك، هناك حدوديتان متفقتان في <math>k-1</math> النقاط ولكنها ليست متساوية، وبالتالي فإن [[Block code|مسافة]] قانون ريد–سولومون هي بالضبط <math>d=n-k+1</math>. ثم المسافة النسبية هي <math>\delta = d/n = 1-k/n + 1/n = 1-R+1/n\sim 1-R</math>، أين <math>R=k/n</math> هو المعدل. إن هذه المقايضة بين المسافة النسبية والمعدل مثالية بشكل مقارب، حيث أن ''كل'' كود  <math>\delta+R\leq 1+1/n</math>. باعتباره رمزًا يحقق هذه المقايضة المثلى، فإن رمز ريد–سولومون ينتمي إلى فئة [[Maximum distance separable code|الرموز القابلة للفصل عند أقصى مسافة]].

في حين أن عدد كثيرات الحدود المختلفة من الدرجة الأقل من ''k'' وعدد الرسائل المختلفة متساويان <math>q^k</math> وبالتالي، يمكن تعيين كل رسالة بشكل فريد لمثل هذه الحدود، وهناك طرق مختلفة للقيام بهذا الترميز. يفسر البناء الأصلي لريد-سولومون الرسالة ''x'' باعتبارها ''معاملات'' كثيرة الحدود ''p''، بينما تفسر البناءات اللاحقة الرسالة باعتبارها ''قيم'' كثيرة الحدود عند أول ''k'' نقطة <math>a_1,\dots,a_k</math> ويمكن الحصول على كثيرة الحدود ''p'' باستيفاء هذه القيم بكثيرة حدود بدرجة أقل من ''k''. تتميز عملية الترميز الأخيرة، وإن كانت أقل كفاءةً بعض الشيء، بميزة أنها تُنتج ، أي أن الرسالة الأصلية تُدرج دائمًا كتسلسل فرعي للكلمة المفتاحية.

==== إجراء ترميز بسيط: الرسالة كسلسلة من المعاملات ====
في البناء الأصلي لريد وسليمان، الرسالة <math>m=(m_0,\dots,m_{k-1}) \in F^k
</math> يتم تعيينه إلى كثير الحدود <math>p_m</math> مع <math display="block">p_m(a) = \sum_{i=0}^{k-1} m_i a^{i} \,.</math> كلمة السر لـ <math>m</math> يتم الحصول عليها عن طريق التقييم <math>p_m</math> في <math>n</math> نقاط مختلفة <math>a_0, \dots, a_{n-1}</math> من الميدان <math>F</math>.  وبالتالي فإن وظيفة الترميز الكلاسيكية <math>C:F^k \to F^n</math> بالنسبة لقانون ريد–سولومون، يتم تعريفه على النحو التالي: <math display="block">C(m) = \begin{bmatrix}
p_m(a_0) \\
p_m(a_1) \\
\cdots \\
p_m(a_{n-1})
\end{bmatrix}</math> هذه الوظيفة <math>C</math> هو [[تحويل خطي|رسم تخطيطي خطي]]، أي أنه يلبي <math>C(m) = Am
</math> لما يلي <math>n \times k</math> -مصفوفة <math>A</math> مع عناصر من <math>F</math> : <math display="block">C(m) = Am = \begin{bmatrix}
1 & a_0 & a_0^2 & \dots & a_0^{k-1} \\
1 & a_1 & a_1^2 & \dots & a_1^{k-1} \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
1 & a_{n-1} & a_{n-1}^2 & \dots & a_{n-1}^{k-1}
\end{bmatrix}
\begin{bmatrix}
m_0 \\
m_1 \\
\vdots \\
m_{k-1}
\end{bmatrix}
</math>

هذه المصفوفة هي [[مصفوفة فاندرموند]] <math>F</math>. بعبارة أخرى، فإن شفرة ريد–سولومون هي [[رمز خطي|شفرة خطية]]، وفي إجراء الترميز الكلاسيكي، تكون [[رمز خطي|مصفوفة المولد]] الخاصة بها <math>A</math>.

==== إجراء الترميز المنهجي: الرسالة كتسلسل أولي من القيم ====
هناك إجراءات ترميز بديلة تعمل على إنتاج رمز ريد–سولومون [[Systematic code|المنهجي]]. تستخدم إحدى الطرق [[متعدد حدود لاغرانج|استيفاء لاغرانج]] لحساب كثيرات الحدود <math>p_m</math> مثل ذلك <math display="block">p_m(a_i) = m_i \text{ for all } i\in\{0,\dots,k - 1\}.
</math> ثم <math>p_m</math> يتم تقييمه في النقاط الأخرى <math>a_k, \dots, a_{n - 1}</math>.

<math display="block">C(m) = \begin{bmatrix}
p_m(a_0) \\
p_m(a_1) \\
\cdots \\
p_m(a_{n-1})
\end{bmatrix}</math>

هذه الوظيفة <math>C</math> هي عبارة عن رسم خطي. لتوليد مصفوفة الترميز النظامية المقابلة G، اضرب مصفوفة Vandermonde A في معكوس مصفوفة المربع الأيسر الفرعية A.

<math display="block">G =
(A\text{'s left square submatrix})^{-1} \cdot A
=
\begin{bmatrix}
1         & 0      & 0         & \dots  & 0      & g_{1,k+1} & \dots  & g_{1,n} \\
0         & 1      & 0         & \dots  & 0      & g_{2,k+1} & \dots  & g_{2,n} \\
0         & 0      & 1         & \dots  & 0      & g_{3,k+1} & \dots  & g_{3,n} \\
\vdots    & \vdots & \vdots    &        & \vdots & \vdots    &        & \vdots  \\
0         & \dots  & 0         & \dots  & 1      & g_{k,k+1} & \dots  & g_{k,n}
\end{bmatrix}</math>

<math>C(m) = Gm</math> لما يلي <math>n \times k</math> -مصفوفة <math>G</math> مع عناصر من <math>F</math> : <math display="block">C(m) = Gm =
\begin{bmatrix}
1     & 0   & 0     & \dots & 0   & g_{1,k+1} & \dots & g_{1,n} \\
0     & 1   & 0     & \dots & 0   & g_{2,k+1} & \dots & g_{2,n} \\
0     & 0   & 1     & \dots & 0   & g_{3,k+1} & \dots & g_{3,n} \\
\vdots  & \vdots & \vdots  &    & \vdots & \vdots  &    & \vdots \\
0     & \dots & 0     & \dots & 1   & g_{k,k+1} & \dots & g_{k,n}
\end{bmatrix}\begin{bmatrix}
m_0 \\
m_1 \\
\vdots \\
m_{k-1}
\end{bmatrix}
</math>

==== تحويل فورييه المتقطع وعكسه ====

[[Discrete Fourier transform (general)|تحويل فورييه المنفصل]] هو في الأساس نفس إجراء الترميز؛ فهو يستخدم متعدد الحدود المولد <math>p_m</math> لربط مجموعة من نقاط التقييم بقيم الرسائل كما هو موضح أعلاه: <math display="block">C(m) = \begin{bmatrix}
p_m(a_0) \\
p_m(a_1) \\
\cdots \\
p_m(a_{n-1})
\end{bmatrix}</math>

يمكن استخدام تحويل فورييه العكسي لتحويل مجموعة خالية من الأخطاء من قيم الرسائل ''n'' < ''q'' مرة أخرى إلى متعددة الحدود المشفرة لمعاملات ''k''، مع القيد الذي ينص على أنه لكي يعمل هذا، يجب أن تكون مجموعة نقاط التقييم المستخدمة لتشفير الرسالة عبارة عن مجموعة من القوى المتزايدة لـ ''α'' : <math display="block">a_i = \alpha^i</math><math display="block">a_0, \dots, a_{n-1} = \{ 1, \alpha, \alpha^2, \dots, \alpha^{n-1} \}</math>

ومع ذلك، فإن استيفاء لاغرانج يؤدي نفس التحويل دون قيود على مجموعة نقاط التقييم أو متطلبات مجموعة خالية من الأخطاء من قيم الرسائل ويُستخدم للترميز المنهجي، وفي إحدى خطوات [[تصحيح خطأ ريد-سليمان|فك تشفير جاو]].

=== وجهة نظر بي سي إتش: الكلمة الرمزية كسلسلة من المعاملات ===
في هذا العرض، يتم تفسير الرسالة كمعاملات متعددة الحدود <math>p(x)</math>. يقوم المرسل بحساب كثير الحدود ذي الصلة <math>s(x)</math> من الدرجة <math>n-1</math> أين <math>n \le q-1</math> ويرسل الحدود المتعددة <math>s(x)</math>. كثيرة الحدود <math>s(x)</math> يتم إنشاؤها عن طريق ضرب حدود الرسالة <math>p(x)</math>، والتي لديها درجة <math>k-1</math>، مع  <math>g(x)</math> من الدرجة <math>n-k</math> وهذا معروف لدى المرسل والمستقبل.مولد الحدود متعدد الحدود <math>g(x)</math> يتم تعريفه على أنه متعدد الحدود الذي تكون جذوره عبارة عن قوى متسلسلة لبدائية مجال جالوا <math>\alpha</math><math display="block">g(x) = \left(x-\alpha^{i}\right) \left(x-\alpha^{i+1}\right) \cdots \left(x-\alpha^{i+n-k-1}\right) = g_0 + g_1x + \cdots + g_{n-k-1}x^{n-k-1} + x^{n-k}</math>

بالنسبة لـ«رمز المعنى الضيق»، <math>i = 1</math>.

<math display="block">\mathbf{C} =
\left\{
  \left ( s_1, s_2,\dots, s_{n} \right)
  \;\Big|\;
  s(a)=\sum_{i=1}^n s_i a^{i}
  \text{ is a polynomial that has at least the roots } \alpha^1,\alpha^2, \dots, \alpha^{n-k}
\right\} .</math>

==== إجراء الترميز المنهجي ====
يمكن تعديل إجراء الترميز لعرض بي سي إتش لرموز ريد–سولومون لإنتاج [[Systematic code|إجراء ترميز منهجي]]، حيث تحتوي كل كلمة رمزية على الرسالة كبادئة، وتضيف ببساطة رموز تصحيح الأخطاء كلاحقة. هنا، بدلا من الإرسال <math>s(x) = p(x) g(x)</math> يقوم المشفر بإنشاء الحدود المنقولة <math>s(x)</math> بحيث تكون معاملات <math>k</math> أكبر أحاديات الحدود تساوي المعاملات المقابلة لـ <math>p(x)</math>، ومعاملات الدرجة الأدنى لـ <math>s(x)</math> يتم اختيارهم بالضبط بهذه الطريقة <math>s(x)</math> يصبح قابلا للقسمة على <math>g(x)</math>. ثم معاملات <math>p(x)</math> هي تسلسل جزئي لمعاملات <math>s(x)</math>. للحصول على كود منهجي بشكل عام، نقوم بإنشاء رسالة متعددة الحدود <math>p(x)</math> من خلال تفسير الرسالة على أنها تسلسل معاملاتها.

رسميًا، يتم البناء عن طريق الضرب <math>p(x)</math> بواسطة <math>x^t</math> لإفساح المجال ل <math>t=n-k</math> رموز التحقق، وتقسيم هذا المنتج على <math>g(x)</math> لإيجاد الباقي، ثم تعويض هذا الباقي عن طريق طرحه. ال <math>t</math> يتم إنشاء رموز التحقق عن طريق حساب الباقي <math>s_r(x)</math> : <math display="block">s_r(x) = p(x)\cdot x^t \ \bmod \ g(x).</math>

الباقي حاصل على درجة علمية على الأكثر <math>t-1</math>، في حين أن معاملات <math>x^{t-1},x^{t-2},\dots,x^1,x^0</math> في كثير الحدود <math>p(x)\cdot x^t</math> هي صفر. لذلك، التعريف التالي للكلمة الرمزية <math>s(x)</math> لديه الخاصية التي هي الأولى <math>k</math> المعاملات متطابقة مع معاملات <math>p(x)</math> : <math display="block">s(x) = p(x)\cdot x^t - s_r(x)\,.</math>ونتيجة لذلك، فإن الكلمات المشفرة <math>s(x)</math> هي في الواقع عناصر من <math>\mathbf{C}</math> أي أنها قابلة للقسمة على متعددة الحدود المولدة <math>g(x)</math> :
<math display="block">s(x) \equiv p(x) \cdot x^t - s_r(x) \equiv s_r(x) - s_r(x) \equiv 0 \mod g(x)\,.</math>هذه الوظيفة <math>s</math> هي عبارة عن رسم خطي. لتوليد مصفوفة الترميز النظامية المقابلة G، قم بتعيين المصفوفة الفرعية المربعة اليسرى لـ G إلى مصفوفة الهوية ثم قم بترميز كل صف:

<math display="block">G =
\begin{bmatrix}
1     & 0   & 0     & \dots & 0   & g_{1,k+1} & \dots & g_{1,n} \\
0     & 1   & 0     & \dots & 0   & g_{2,k+1} & \dots & g_{2,n} \\
0     & 0   & 1     & \dots & 0   & g_{3,k+1} & \dots & g_{3,n} \\
\vdots  & \vdots & \vdots  &    & \vdots & \vdots  &    & \vdots \\
0     & \dots & 0     & \dots & 1   & g_{k,k+1} & \dots & g_{k,n}
\end{bmatrix}</math> مع تجاهل الأصفار الأولية، الصف الأخير = <math>g(x)</math>.

<math>C(m) = mG</math> لما يلي <math>n \times k</math> -مصفوفة <math>G</math> مع عناصر من <math>F</math> : <math display="block">C(m) = mG = \begin{bmatrix} m_0 & m_1 & \ldots & m_{k-1}\end{bmatrix}
\begin{bmatrix}
1     & 0   & 0     & \dots & 0   & g_{1,k+1} & \dots & g_{1,n} \\
0     & 1   & 0     & \dots & 0   & g_{2,k+1} & \dots & g_{2,n} \\
0     & 0   & 1     & \dots & 0   & g_{3,k+1} & \dots & g_{3,n} \\
\vdots  & \vdots & \vdots  &    & \vdots & \vdots  &    & \vdots \\
0     & \dots & 0     & \dots & 1   & g_{k,k+1} & \dots & g_{k,n}
\end{bmatrix}
</math>

== الخصائص ==

رمز ريد–سولومون هو رمز [ ''n''، ''k''، ''n'' &#x2212; ''k'' + 1]؛ بمعنى آخر، هو [[رمز خطي|رمز كتلة خطي]] بطول ''n'' (على ''F'') مع [[بعد (فضاء متجهي)|البعد]] ''k'' [[مسافة هامينغ|ومسافة هامينج]] الدنيا <math display="inline">d_{\min} = n-k+1.</math> يعتبر كود ريد–سولومون مثاليًا بمعنى أن الحد الأدنى للمسافة له أقصى قيمة ممكنة لكود خطي بحجم (''n''،&nbsp;''ك'')؛ وهذا ما يُعرف باسم . يُطلق على هذا الرمز أيضًا اسم .

يتم تحديد قدرة تصحيح الخطأ لرمز ريد–سولومون من خلال المسافة الدنيا، أو على نحو مكافئ، من خلال <math>n - k</math>، مقياس التكرار في الكتلة. إذا لم تكن مواقع رموز الخطأ معروفة مسبقًا، فيمكن لكود ريد–سولومون تصحيح ما يصل إلى <math>(n-k)/2</math> الرموز الخاطئة، أي أنه يمكنه تصحيح نصف عدد الأخطاء التي تحتوي على رموز زائدة تمت إضافتها إلى الكتلة. في بعض الأحيان تكون مواقع الأخطاء معروفة مسبقًا (على سبيل المثال، «المعلومات الجانبية» في [[نسبة الإشارة إلى الضجيج|نسبة الإشارة إلى الضوضاء]] في [[فك تعديل|جهاز إزالة التعديل]]) - وتسمى هذه [[قناة المحو الثنائية|بالمحو]]. يمكن لرمز ريد–سولومون (مثل أي [[Maximum distance separable code|رمز إم دي إس]]) تصحيح ضعف عدد المحو مقارنة بالأخطاء، ويمكن تصحيح أي مجموعة من الأخطاء والمحو طالما تم استيفاء العلاقة ، حيث <math>E</math> هو عدد الأخطاء و <math>S</math> هو عدد المحو في الكتلة.

[[ملف:RS BER.png|400px|يمين|تصغير| الأداء النظري لمعدل البتات لرمز ريد–سولومون (إن=255، كيه=233، كيو بي إس كي، أوجن). خاصية تشبه الخطوة.]]

يمكن وصف حد الخطأ النظري من خلال الصيغة التالية لقناة [[Additive white Gaussian noise|أوجن]] [[إبدال بإزاحة التردد|لإبدال بإزاحة التردد]]: <math display="block">P_b \approx \frac{2^{m-1}}{2^m-1}\frac{1}{n}\sum_{\ell=t+1}^n \ell {n\choose \ell}P_s^\ell(1-P_s)^{n-\ell}</math> ولخطط التعديل الأخرى: <math display="block">P_b \approx \frac{1}{m}\frac{1}{n}\sum_{\ell=t+1}^n \ell {n\choose \ell} P_s^\ell(1-P_s)^{n-\ell}</math> أين <math display="inline">t = \frac{1}{2}(d_{\min}-1)</math>، <math>P_s = 1-(1-s)^h</math>، <math>h = \frac{m}{\log_2M}</math>، <math>s</math> هو معدل خطأ الرمز في حالة أوجن غير المشفرة و <math>M</math> هو ترتيب التعديل.

بالنسبة للاستخدامات العملية لرموز ريد–سولومون، من الشائع استخدام حقل محدود <math>F</math> مع <math>2^m</math> عناصر. في هذه الحالة، يمكن تمثيل كل رمز على أنه <math>m</math> قيمة البت. يرسل المرسل نقاط البيانات ككتل مشفرة، وعدد الرموز في الكتلة المشفرة هو <math>n = 2^m - 1</math>. وبالتالي، فإن كود ريد–سولومون الذي يعمل على رموز مكونة من 8 بتات لديه <math>n = 2^8 - 1 = 255</math> الرموز لكل كتلة. (هذه قيمة شائعة جدًا نظرًا لانتشار أنظمة الكمبيوتر [[Byte-oriented|الموجهة للبايتات]].) الرقم <math>k</math>، مع <math>k < n</math>، عدد رموز ''البيانات'' في الكتلة هو معلمة تصميم. الكود المستخدم بشكل شائع يشفر <math>k = 223</math> رموز بيانات مكونة من ثمانية بتات بالإضافة إلى 32 رمز تكافؤ مكون من ثمانية بتات في <math>n = 255</math> - كتلة الرمز؛ يُشار إليها باسم <math>(n, k) = (255,223)</math> الكود، وهو قادر على تصحيح ما يصل إلى 16 خطأ رمزي لكل كتلة.

إن خصائص كود ريد–سولومون التي تمت مناقشتها أعلاه تجعلها مناسبة بشكل خاص للتطبيقات التي تحدث فيها أخطاء في [[خطأ انفجار|الانفجارات]]. يرجع ذلك إلى أنه لا يهم بالنسبة للكود عدد البتات الموجودة في الرمز التي تحتوي على أخطاء - إذا كانت بتات متعددة في رمز تالفة، فإن هذا يعد خطأ واحدًا فقط. وعلى العكس من ذلك، إذا لم يكن تدفق البيانات يتميز بتفجر الأخطاء أو الانقطاعات ولكن بأخطاء بت واحدة عشوائية، فإن رمز ريد–سولومون عادة ما يكون خيارًا سيئًا مقارنة بالرمز الثنائي.

إن شفرة ريد–سولومون، مثل ، هي شفرة شفافة. وهذا يعني أنه إذا تم [[عملية على مستوى البتات|عكس]] رموز القناة في مكان ما على طول الخط، فسوف تستمر أجهزة فك التشفير في العمل. وستكون النتيجة عكس البيانات الأصلية. ومع ذلك، يفقد كود ريد–سولومون شفافيته عندما يتم اختصار الكود (''انظر الملاحظات في نهاية هذا القسم''). يجب ملء البتات «المفقودة» في الكود المختصر إما بالأصفار أو الواحدات، اعتمادًا على ما إذا كانت البيانات مكملة أم لا. (بعبارة أخرى، إذا تم عكس الرموز، فيجب عكس التعبئة الصفرية إلى تعبئة واحدة.) لهذا السبب، من الضروري حل معنى البيانات (أي، صحيحة أو متممة) قبل فك تشفير ريد–سولومون.

إن كون قانون ريد–سولومون [[Cyclic code|دوريًا]] أم لا يعتمد على التفاصيل الدقيقة للبناء. في وجهة النظر الأصلية لريد وسولومون، حيث تكون الكلمات الرمزية هي قيم كثيرة الحدود، يمكن للمرء اختيار تسلسل نقاط التقييم بطريقة تجعل الكود دوريًا. وعلى وجه الخصوص، إذا <math>\alpha</math> هو  للحقل <math>F</math>، إذن حسب التعريف فإن جميع العناصر غير الصفرية لـ <math>F</math> خذ النموذج <math>\alpha^i</math> ل <math>i\in\{1,\dots,q-1\}</math>، أين <math>q=|F|</math>. كل كثيرة حدود <math>p</math> زيادة <math>F</math> يؤدي إلى ظهور كلمة مرور <math>(p(\alpha^1),\dots,p(\alpha^{q-1}))</math>. منذ الوظيفة <math>a \mapsto p(\alpha a)</math> هي أيضًا كثيرة حدود من نفس الدرجة، هذه الدالة تؤدي إلى كلمة رمزية <math>(p(\alpha^2),\dots,p(\alpha^{q}))</math> ؛ منذ <math>\alpha^{q}=\alpha^1</math> صحيح أن هذه الكلمة الرمزية هي [[انتقال دوراني|التحول الدوري إلى اليسار]] للكلمة الرمزية الأصلية المشتقة من <math>p</math>. وبالتالي فإن اختيار تسلسل من قوى الجذر البدائية كنقط تقييم يجعل العرض الأصلي لرمز ريد–سولومون [[Cyclic code|دوريًا]]. تكون رموز ريد–سولومون في عرض بي سي إتش دورية دائمًا لأن [[رمز بي سي إتش|رموز بي سي إتش دورية]].

=== الملاحظات ===

لا يُطلب من المصممين استخدام الأحجام «الطبيعية» لكتل كود ريد–سولومون. يمكن لتقنية تُعرف باسم «الاختصار» إنتاج كود أصغر بأي حجم مرغوب من كود أكبر. على سبيل المثال، يمكن تحويل الكود المستخدم على نطاق واسع (255,223) إلى كود (160,128) عن طريق تعبئة الجزء غير المستخدم من كتلة المصدر بـ 95 صفرًا ثنائيًا وعدم إرسالها. في جهاز فك التشفير، يتم تحميل نفس الجزء من الكتلة محليًا باستخدام الأصفار الثنائية.

يستخدم رمز الاستجابة السريعة، الإصدار 3 (29×29) كتلًا متداخلة. تتكون الرسالة من 26 بايت بيانات ويتم تشفيرها باستخدام كتلتين من رموز ريد-سولومون. كل كتلة عبارة عن رمز (255,233) ريد سولومون مختصر إلى رمز (35,13).

توضح نظرية ديلسارت-جوثالز-سايدل مثالاً لتطبيق رموز ريد–سولومون المختصرة. وبالتوازي مع الاختصار، هناك تقنية تُعرف [[Punctured code|بالثقب]] تسمح بحذف بعض رموز التكافؤ المشفرة.

== فك تشفير عرض بي سي إتش ==

تستخدم أجهزة فك التشفير الموصوفة في هذا القسم عرض بي سي إتش لكلمة رمزية كسلسلة من المعاملات. وتستخدم متعددة حدود مولدة ثابتة معروفة لكلٍّ من جهاز التشفير وجهاز فك التشفير.

=== وحدة فك ترميز بيترسون-جورنشتاين-زيرلر ===



قام دانييل جورنشتاين ونيل زيرلر بتطوير جهاز فك تشفير تم وصفه في تقرير صادر عن مختبر لينكولن التابع لمعهد ماساتشوستس للتكنولوجيا بواسطة زيرلر في يناير 1960 وفي وقت لاحق في ورقة بحثية في يونيو 1961. تم وصف فك تشفير جورنشتاين-زيرلر والعمل المرتبط به على رموز بي سي إتش في كتاب ''رموز تصحيح الأخطاء'' بقلم [[و. ويزلي بيترسون]] (1961).

==== التركيبة ====

الرسالة المرسلة <math>(c_0, \ldots, c_i, \ldots,c_{n-1})</math>، يُنظر إليها على أنها معاملات متعددة الحدود <math display="block">
 s(x) = \sum_{i=0}^{n-1} c_i x^i.
</math>

نتيجة لإجراء ترميز ريد–سولومون، ''فإن s'' (''x'') قابلة للقسمة على متعددة الحدود المولدة <math display="block">
 g(x) = \prod_{j=1}^{n-k} (x - \alpha^j),
</math> حيث ''α'' هو عنصر بدائي.

نظرًا لأن ''s'' (''x'') مضاعف للمولد ''g'' (''x'')، فمن الطبيعي أن «يرث» كل جذوره: <math display="block">
 s(x) \bmod (x - \alpha^j) = g(x) \bmod (x - \alpha^j) = 0.
</math> لذلك، <math display="block">
 s(\alpha^j) = 0,\ j = 1, 2, \ldots, n - k.
</math>

يتم إتلاف الحدود المنقولة أثناء النقل بسبب خطأ الحدود <math display="block">
 e(x) = \sum_{i=0}^{n-1} e_i x^i
</math> لإنتاج الحدود المستلمة <math display="block">
 r(x) = s(x) + e(x).
</math>

سيكون المعامل ''e <sub>i</sub>'' صفرًا إذا لم يكن هناك خطأ عند تلك القوة لـ ''x''، وغير صفر إذا كان هناك خطأ. إذا كانت هناك أخطاء ''ν'' عند قوى مميزة ''i <sub>k</sub>'' لـ ''x''، إذن <math display="block">
 e(x) = \sum_{k=1}^\nu e_{i_k} x^{i_k}.
</math>

الهدف من فك التشفير هو العثور على عدد الأخطاء (''ν'')، ومواضع الأخطاء (''i <sub>k</sub>'')، وقيم الأخطاء في تلك المواضع (''e <sub>i <sub>k</sub></sub>''). ومن تلك القيم، يمكن حساب ''e'' (''x'') وطرحه من ''r'' (''x'') للحصول على الرسالة المرسلة في الأصل ''s'' (''x'').

==== فك تشفير المتلازمة ====

يبدأ فك التشفير بتقييم الحدود الواردة في النقاط <math>\alpha^1 \dots \alpha^{n-k}</math>. نحن نطلق على نتائج هذا التقييم اسم «المتلازمات» ''S'' <sub>''j''</sub>. يتم تعريفهم على أنهم <math display="block">
 \begin{align}
 S_j &= r(\alpha^j) = s(\alpha^j) + e(\alpha^j) = 0 + e(\alpha^j) \\
   &= e(\alpha^j) \\
   &= \sum_{k=1}^\nu e_{i_k} {(\alpha^j)}^{i_k}, \quad j = 1, 2, \ldots, n - k.
 \end{align}
</math> لاحظ أن <math>s(\alpha^j) = 0</math> لأن <math>s(x)</math> له جذور في <math>\alpha^j</math> كما هو موضح في القسم السابق.

ميزة النظر إلى المتلازمات هي أن متعدد حدود الرسالة يختفي. بمعنى آخر، تتعلق المتلازمات بالخطأ فقط ولا تتأثر بالمحتوى الفعلي للرسالة المرسلة. إذا كانت جميع المتلازمات صفرًا، تتوقف الخوارزمية عند هذا الحد وتُبلغ عن عدم تلف الرسالة أثناء النقل.

==== محددات الأخطاء وقيم الأخطاء ====


من أجل الراحة، قم بتحديد **مواقع الأخطاء** ''X <sub>k</sub>'' **وقيم الأخطاء** ''Y <sub>k</sub>'' على النحو التالي <math display="block">
 X_k = \alpha^{i_k}, \quad Y_k = e_{i_k}.
</math>

ومن ثم يمكن كتابة المتلازمات من حيث مواقع الأخطاء وقيم الأخطاء هذه على النحو التالي: <math display="block">
 S_j = \sum_{k=1}^\nu Y_k X_k^j.
</math>

هذا التعريف لقيم المتلازمة يعادل التعريف السابق منذ <math>{(\alpha^j)}^{i_k} = \alpha^{j \cdot i_k} = {(\alpha^{i_k})}^j = X_k^j</math>.

تعطي المتلازمات نظامًا من معادلات  في مجهولين 2 ''ν''، ولكن نظام المعادلات هذا غير خطي في ''X <sub>k</sub>'' وليس له حل واضح. ومع ذلك، إذا كانت قيمة ''X <sub>k</sub>'' معروفة (انظر أدناه)، فإن معادلات المتلازمة توفر نظامًا خطيًا من المعادلات <math display="block">\begin{bmatrix}
X_1^1 & X_2^1 & \cdots & X_\nu^1 \\
X_1^2 & X_2^2 & \cdots & X_\nu^2 \\
\vdots & \vdots & \ddots & \vdots \\
X_1^{n-k} & X_2^{n-k} & \cdots & X_\nu^{n-k} \\
\end{bmatrix}
\begin{bmatrix}
Y_1 \\ Y_2 \\ \vdots \\ Y_\nu
\end{bmatrix}
=
\begin{bmatrix}
S_1 \\ S_2 \\ \vdots \\ S_{n-k}
\end{bmatrix},
</math> والتي يمكن حلها بسهولة لقيم خطأ ''Y <sub>k</sub>''.

وبالتالي، فإن المشكلة تكمن في إيجاد ''X<sub>k</sub>''، لأنه عندها ستكون المصفوفة الموجودة في أقصى اليسار معروفة، ويمكن ضرب كلا جانبي المعادلة في معكوسها، مما ينتج عنه Y''<sub>k</sub>''.

في متغير هذه الخوارزمية حيث تكون مواقع الأخطاء معروفة بالفعل (عندما يتم استخدامها )، فهذه هي النهاية. إن مواقع الخطأ (''X <sub>k</sub>'') معروفة بالفعل من خلال بعض الطرق الأخرى (على سبيل المثال، في إرسال FM، يمكن تحديد الأقسام التي كان فيها تدفق البتات غير واضح أو تم التغلب عليه بالتداخل بشكل احتمالي من تحليل التردد). في هذا السيناريو، ما يصل إلى <math>n - k</math> يمكن تصحيح الأخطاء.

يعمل باقي الخوارزمية على تحديد الأخطاء وسيتطلب قيم متلازمة تصل إلى <math>2\nu</math>، بدلا من مجرد <math>\nu</math> المستخدمة حتى الآن. لهذا السبب، هناك حاجة إلى إضافة عدد مضاعف من رموز تصحيح الأخطاء مقارنة بالعدد الذي يمكن تصحيحه دون معرفة مواقعها.

==== متعدد الحدود لتحديد الخطأ ====

هناك علاقة تكرار خطية تُنتج نظامًا من المعادلات الخطية. حل هذه المعادلات يُحدد مواقع الخطأ ''X<sub>k</sub>''.



قم بتعريف **متعددة حدود تحديد الخطأ**  على أنها <math display="block">
 \Lambda(x) = \prod_{k=1}^\nu (1 - x X_k ) = 1 + \Lambda_1 x^1 + \Lambda_2 x^2 + \cdots + \Lambda_\nu x^\nu.
</math>

أصفار  هي مقلوبات <math>X_k^{-1}</math>. يتبع هذا من بناء تدوين المنتج أعلاه، لأنه إذا <math>x = X_k^{-1}</math>، ثم يصبح أحد الحدود المضروبة صفرًا، <math>(1 - X_k^{-1} \cdot X_k) = 1 - 1 = 0</math>، مما يجعل تقييم متعدد الحدود بأكمله يساوي الصفر: <math display="block">
 \Lambda(X_k^{-1}) = 0.
</math>

يترك <math>j</math> يكون أي عدد صحيح بحيث <math>1 \leq j \leq \nu</math>. اضرب كلا الطرفين في <math>Y_k X_k^{j+\nu}</math>، وسيظل صفرًا: <math display="block">\begin{align}
 & Y_k X_k^{j+\nu} \Lambda(X_k^{-1}) = 0, \\
 & Y_k X_k^{j+\nu} (1 + \Lambda_1 X_k^{-1} + \Lambda_2 X_k^{-2} + \cdots + \Lambda_\nu X_k^{-\nu}) = 0, \\
 & Y_k X_k^{j+\nu} + \Lambda_1 Y_k X_k^{j+\nu} X_k^{-1} + \Lambda_2 Y_k X_k^{j+\nu} X_k^{-2} + \cdots + \Lambda_\nu Y_k X_k^{j+\nu} X_k^{-\nu} = 0, \\
 & Y_k X_k^{j+\nu} + \Lambda_1 Y_k X_k^{j+\nu-1} + \Lambda_2 Y_k X_k^{j+\nu-2} + \cdots + \Lambda_\nu Y_k X_k^j = 0.
\end{align} </math>

المجموع لـ ''k'' = 1 إلى ''ν''، وسيظل صفرًا: <math display="block">
 \sum_{k=1}^\nu (Y_k X_k^{j+\nu} + \Lambda_1 Y_k X_k^{j+\nu-1} + \Lambda_2 Y_k X_k^{j+\nu-2} + \cdots + \Lambda_{\nu} Y_k X_k^j) = 0.
</math>

اجمع كل مصطلح في مجموع خاص به: <math display="block">
 \left(\sum_{k=1}^\nu Y_k X_k^{j+\nu}\right) + \left(\sum_{k=1}^\nu \Lambda_1 Y_k X_k^{j+\nu-1}\right) + \left(\sum_{k=1}^\nu \Lambda_2 Y_k X_k^{j+\nu -2}\right) + \cdots + \left(\sum_{k=1}^\nu \Lambda_\nu Y_k X_k^j\right) = 0.
</math>

استخرج القيم الثابتة لـ <math>\Lambda</math> التي لا تتأثر بالمجموع: <math display="block">
 \left(\sum_{k=1}^\nu Y_k X_k^{j+\nu}\right) + \Lambda_1 \left(\sum_{k=1}^\nu Y_k X_k^{j+\nu-1}\right) + \Lambda_2 \left(\sum_{k=1}^\nu Y_k X_k^{j+\nu-2}\right) + \cdots + \Lambda_\nu \left(\sum_{k=1}^\nu Y_k X_k^j\right) = 0.
</math>

أصبحت هذه المجاميع الآن تعادل قيم المتلازمة، والتي نعرفها ويمكننا استبدالها. وهذا يقلل بالتالي إلى <math display="block">
 S_{j+\nu} + \Lambda_1 S_{j+\nu-1} + \cdots + \Lambda_{\nu-1} S_{j+1} + \Lambda_\nu S_j = 0.
</math>

الطرح <math>S_{j+\nu}</math> من كلا الجانبين العائدات <math display="block">
 S_j \Lambda_\nu + S_{j+1} \Lambda_{\nu-1} + \cdots + S_{j+\nu-1} \Lambda_1 = -S_{j+\nu}.
</math>

تذكر أن ''j'' تم اختياره ليكون أي عدد صحيح بين 1 و ''v'' شاملًا، وهذا التكافؤ صحيح لجميع هذه القيم. وبالتالي، ''لدينا'' معادلة خطية، وليس معادلة واحدة فقط. وبالتالي، يمكن حل نظام المعادلات الخطية هذا لمعاملات Λ <sub>''i''</sub> لمتعددة حدود موقع الخطأ: <math display="block">
 \begin{bmatrix}
 S_1 & S_2 & \cdots & S_\nu \\
 S_2 & S_3 & \cdots & S_{\nu+1} \\
 \vdots & \vdots & \ddots & \vdots \\
 S_\nu & S_{\nu+1} & \cdots & S_{2\nu-1}
 \end{bmatrix}
 \begin{bmatrix}
 \Lambda_\nu \\ \Lambda_{\nu-1} \\ \vdots \\ \Lambda_1
 \end{bmatrix}
 =
 \begin{bmatrix}
 -S_{\nu+1} \\ -S_{\nu+2} \\ \vdots \\ -S_{\nu+\nu}
 \end{bmatrix}.
</math> يفترض ما سبق أن فك التشفير يعرف عدد الأخطاء ''ν''، ولكن هذا العدد لم يتم تحديده بعد. لا يقوم فك التشفير PGZ بتحديد ''ν'' بشكل مباشر، بل يبحث عنه عن طريق تجربة القيم المتعاقبة. يفترض فك التشفير أولاً أكبر قيمة للتجربة ''ν'' ويقوم بإعداد النظام الخطي لتلك القيمة. إذا كان من الممكن حل المعادلات (أي أن محدد المصفوفة ليس صفرًا)، فإن قيمة التجربة هي عدد الأخطاء. إذا لم يكن من الممكن حل النظام الخطي، يتم تقليل التجربة ''ν'' بمقدار واحد ويتم فحص النظام الأصغر التالي. 

==== إيجاد جذور متعددة حدود تحديد الخطأ ====

استخدم المعاملات Λ <sub>''التي''</sub> وجدتها في الخطوة الأخيرة لبناء متعدد حدود موقع الخطأ. يمكن العثور على جذور متعددة الحدود الخاصة بموقع الخطأ من خلال البحث الشامل. محددات الخطأ ''X <sub>k</sub>'' هي مقلوبات تلك الجذور. يمكن عكس ترتيب معاملات كثيرة الحدود لموقع الخطأ، وفي هذه الحالة تكون جذور كثيرة الحدود المعكوسة هي محددات الخطأ <math>X_k</math> (ليس متبادلهما <math>X_k^{-1}</math>). يعد  تنفيذًا فعالًا لهذه الخطوة.

==== حساب قيم الخطأ ====

بمجرد معرفة مواقع الخطأ ''X <sub>k</sub>''، يمكن تحديد قيم الخطأ. يمكن القيام بذلك عن طريق الحل المباشر لـ ''Y <sub>k</sub>'' في مصفوفة [[تصحيح خطأ ريد-سليمان|معادلات الخطأ]] المذكورة أعلاه، أو باستخدام .

==== حساب مواقع الخطأ ====

احسب ''i <sub>k</sub>'' عن طريق أخذ قاعدة اللوغاريتم <math>\alpha</math> من ''X <sub>ك</sub>''. يتم ذلك عادةً باستخدام جدول بحث محسوب مسبقًا.

==== إصلاح الأخطاء ====

أخيرًا، يتم إنشاء ''e'' (''x'') من ''i <sub>k</sub>'' و ''e <sub>i <sub>k</sub></sub>'' ثم يتم طرحه من ''r'' (''x'') للحصول على الرسالة المرسلة في الأصل ''s'' (''x'')، مع تصحيح الأخطاء.

==== الأمثلة ====

خذ بعين الاعتبار رمز ريد–سولومون المحدد في  مع  و  (يستخدم هذا في رموز ) لكود آر إس (7,3). الحدود المولدة هي <math display="block">
 g(x) = (x - 3)(x - 3^2)(x - 3^3)(x - 3^4) = x^4 + 809 x^3 + 723 x^2 + 568 x + 522.
</math> إذا كانت متعددة حدود الرسالة هي ، فسيتم ترميز كلمة رمزية منهجية على النحو التالي: <math display="block">
 s_r(x) = p(x) \, x^t \bmod g(x) = 547 x^3 + 738 x^2 + 442 x + 455,
</math><math display="block">
 s(x) = p(x) \, x^t - s_r(x) = 3 x^6 + 2 x^5 + 1 x^4 + 382 x^3 + 191 x^2 + 487 x + 474.
</math> قد تؤدي الأخطاء في الإرسال إلى استلام هذا بدلاً من ذلك: <math display="block">
 r(x) = s(x) + e(x) = 3 x^6 + 2 x^5 + 123 x^4 + 456 x^3 + 191 x^2 + 487 x + 474.
</math> يتم حساب المتلازمات عن طريق تقييم ''r'' عند قوى ''α'' : <math display="block">
 S_1 = r(3^1) = 3 \cdot 3^6 + 2 \cdot 3^5 + 123 \cdot 3^4 + 456 \cdot 3^3 + 191 \cdot 3^2 + 487 \cdot 3 + 474 = 732,
</math><math display="block">
 S_2 = r(3^2) = 637,\quad S_3 = r(3^3) = 762,\quad S_4 = r(3^4) = 925,
</math> إنتاج النظام <math display="block">
 \begin{bmatrix}
 732 & 637 \\
 637 & 762
 \end{bmatrix}
 \begin{bmatrix}
 \Lambda_2 \\ \Lambda_1
 \end{bmatrix}
 =
 \begin{bmatrix}
 -762 \\ -925
 \end{bmatrix}
 =
 \begin{bmatrix}
 167 \\ 004
 \end{bmatrix}.
</math>

باستخدام [[حذف غاوسي|الإزالة الغاوسية]]، <math display="block">
 \begin{bmatrix}
 001 & 000 \\
 000 & 001
 \end{bmatrix}
 \begin{bmatrix}
 \Lambda_2 \\ \Lambda_1
 \end{bmatrix}
 =
 \begin{bmatrix}
 329 \\ 821
 \end{bmatrix},
</math> لذا <math display="block">
 \Lambda(x) = 329 x^2 + 821 x + 001,
</math> مع الجذور ''x'' <sub>1</sub> = 757 = 3 <sup>−3</sup> و ''x'' <sub>2</sub> = 562 = 3 <sup>−4</sup>. يمكن عكس المعاملات: <math display="block">
 R(x) = 001 x^2 + 821 x + 329,
</math> لإنتاج الجذور 27 = 3 <sup>3</sup> و 81 = 3 <sup>4</sup> مع أسس موجبة، ولكن عادةً لا يتم استخدام ذلك. يتوافق لوغاريتم الجذور المقلوبة مع مواقع الخطأ (من اليمين إلى اليسار، الموقع 0 هو المصطلح الأخير في الكلمة الرمزية).

لحساب قيم الخطأ، قم بتطبيق  : <math display="block">
 \Omega(x) = S(x) \Lambda(x) \bmod x^4 = 546 x + 732,
</math><math display="block">
 \Lambda'(x) = 658 x + 821,
</math><math display="block">
 e_1 = -\Omega(x_1)/\Lambda'(x_1) = 074,
</math><math display="block">
 e_2 = -\Omega(x_2)/\Lambda'(x_2) = 122.
</math>

الطرح <math>e_1 x^3 + e_2 x^4 = 74x^3 + 122x^4</math> من متعددة الحدود المستلمة ''r'' (''x'') تعيد إنتاج كلمة المرور الأصلية ''s''.

=== فك تشفير بيرليكامب-ماسي ===
 هي إجراء تكراري بديل للعثور على متعدد الحدود لتحديد الخطأ. أثناء كل تكرار، يقوم بحساب التناقض بناءً على حالة حالية من Λ(''x'') مع عدد مفترض من الأخطاء ''e'' : <math display="block"> \Delta = S_{i} + \Lambda_1 \ S_{i-1} + \cdots + \Lambda_e \ S_{i-e}</math> ثم يقوم بتعديل Λ(''x'') و ''e'' بحيث يصبح Δ المعاد حسابه صفرًا. تحتوي المقالة «» على وصف تفصيلي للإجراء. في المثال التالي، يتم استخدام ''C'' (''x'') لتمثيل Λ(''x'').

==== الأمثلة ====

باستخدام نفس البيانات المستخدمة في مثال بيترسون جورنشتاين زيرلر أعلاه:


القيمة النهائية لـ ''C'' هي متعددة حدود تحديد الخطأ، Λ(''x'').

=== فك تشفير سوجياما ===

تعتمد طريقة تكرارية أخرى لحساب كل من متعدد حدود تحديد الخطأ ومتعدد حدود قيمة الخطأ على تكييف سوجياما [[خوارزمية إقليدس الممددة|لخوارزمية إقليدية ممتدة]].

عرف ''S'' (''x'')، Λ(''x'')، وΩ(''x'') لمتلازمات ''t'' وأخطاء ''e'' : <math display="block"> \begin{align}
S(x) &= S_{t} x^{t-1} + S_{t-1} x^{t-2} + \cdots + S_2 x + S_1 \\[1ex]
\Lambda(x) &= \Lambda_{e} x^{e} + \Lambda_{e-1} x^{e-1} + \cdots + \Lambda_{1} x + 1 \\[1ex]
\Omega(x) &= \Omega_{e} x^{e} + \Omega_{e-1} x^{e-1} + \cdots + \Omega_{1} x + \Omega_{0}
\end{align} </math>

المعادلة الأساسية هي: <math display="block"> \Lambda(x) S(x) = Q(x) x^{t} + \Omega(x) </math>

بالنسبة إلى ''t'' = 6 و ''e'' = 3: <math display="block">\begin{bmatrix}
\Lambda_3 S_6 & x^8 \\
\Lambda_2 S_6 + \Lambda_3 S_5 & x^7 \\
\Lambda_1 S_6 + \Lambda_2 S_5 + \Lambda_3 S_4 & x^6 \\
     S_6 + \Lambda_1 S_5 + \Lambda_2 S_4 + \Lambda_3 S_3 & x^5 \\
     S_5 + \Lambda_1 S_4 + \Lambda_2 S_3 + \Lambda_3 S_2 & x^4 \\
     S_4 + \Lambda_1 S_3 + \Lambda_2 S_2 + \Lambda_3 S_1 & x^3 \\
     S_3 + \Lambda_1 S_2 + \Lambda_2 S_1 & x^2 \\
     S_2 + \Lambda_1 S_1 & x \\
     S_1
\end{bmatrix}
=
\begin{bmatrix}
Q_2 x^8 \\
Q_1 x^7 \\
Q_0 x^6 \\
0 \\
0 \\
0 \\
\Omega_2 x^2 \\
\Omega_1 x \\
\Omega_0
\end{bmatrix}
</math>

الحدود الوسطى هي صفر بسبب العلاقة بين Λ والمتلازمات.

يمكن لخوارزمية إقليدية ممتدة العثور على سلسلة من كثيرات الحدود من النموذج



حيث تقل درجة ''R'' مع زيادة ''i''. بمجرد أن تصبح درجة ''R'' <sub>''i''</sub> (''x'') < ''t'' /2، فإن




لا يلزم حفظ ''B'' (''x'') و ''Q'' (''x'')، لذا تصبح الخوارزمية:

 ''R''<sub>−1</sub> := ''x''<sup>''t''</sup>
 ''R''<sub>0</sub>  := ''S''(''x'')
 ''A''<sub>−1</sub> := 0
 ''A''<sub>0</sub>  := 1
 ''i'' := 0
 **while** degree of ''R''<sub>''i''</sub> ≥ ''t''/2
   ''i'' := ''i'' + 1
   ''Q'' := ''R''<sub>''i''-2</sub> / ''R''<sub>''i''-1</sub>
   ''R''<sub>''i''</sub> := ''R''<sub>''i''-2</sub> - ''Q'' ''R''<sub>''i''-1</sub>
   ''A''<sub>''i''</sub> := ''A''<sub>''i''-2</sub> - ''Q'' ''A''<sub>''i''-1</sub>
لتعيين الحد الأدنى من الترتيب لـ Λ(''x'') إلى 1، قسّم Λ(''x'') وΩ(''x'') على ''A'' <sub>''i''</sub> (0):


''A'' <sub>''i''</sub> (0) هو الحد الثابت (من الدرجة المنخفضة) لـ A <sub>i</sub>.

==== الأمثلة ====

باستخدام نفس البيانات المستخدمة في مثال بيترسون-جورينشتاين-زيرلر أعلاه:






=== فك التشفير باستخدام تحويل فورييه المنفصل ===
يمكن استخدام تحويل فورييه المنفصل لفك التشفير. لتجنب التعارض مع أسماء المتلازمات، دع ''c'' (''x'') = ''s'' (''x'') هي الكلمة المشفرة. ''r'' (''x'') و ''e'' (''x'') هما نفس الشيء المذكور أعلاه. عرف ''C'' (''x'')، و ''E'' (''x'')، و ''R'' (''x'') على أنها تحويلات فورييه المنفصلة لـ ''c'' (''x'')، و ''e'' (''x'')، و ''r'' (''x''). نظرًا لأن ''r'' (''x'') = ''c'' (''x'') + ''e'' (''x'')، ونظرًا لأن تحويل فورييه المنفصل هو عامل خطي، ''فإن R'' (''x'') = ''C'' (''x'') + ''E'' (''x'').

قم بتحويل ''r'' (''x'') إلى ''R'' (''x'') باستخدام تحويل فورييه المنفصل. نظرًا لأن حساب تحويل فورييه المنفصل هو نفس حساب المتلازمات، فإن معاملات ''t'' لـ ''R'' (''x'') و ''E'' (''x'') هي نفس المتلازمات: <math display="block">R_j = E_j = S_j = r(\alpha^j) \qquad \text{for } 1 \le j \le t</math>

يستخدم <math>R_1</math> خلال <math>R_t</math> كمتلازمات (إنها نفس الشيء) وتوليد متعدد الحدود لتحديد الخطأ باستخدام الأساليب من أي من أجهزة فك التشفير المذكورة أعلاه.

ليكن ''v'' = عدد الأخطاء. توليد ''E'' (''x'') باستخدام المعاملات المعروفة <math>E_1</math> ل <math>E_t</math>، متعدد الحدود لتحديد الخطأ، وهذه الصيغ <math display="block">\begin{align}
E_0 &= - \frac{1}{\Lambda_v}(E_{v} + \Lambda_1 E_{v-1} + \cdots + \Lambda_{v-1} E_{1}) \\
E_j &= -(\Lambda_1 E_{j-1} + \Lambda_2 E_{j-2} + \cdots + \Lambda_v E_{j-v})
& \text{for } t < j < n
\end{align}</math>

ثم احسب ''C'' (''x'') = ''R'' (''x'') − ''E'' (''x'') واستخدم التحويل العكسي (الاستيفاء متعدد الحدود) لـ ''C'' (''x'') لإنتاج ''c'' (''x'').

=== فك التشفير خارج حدود تصحيح الخطأ ===

تنص  على أن الحد الأدنى للمسافة **' لكتلة رمزية خطية بحجم (**'، **') يحدها الحد العلوي . كان من المفهوم عادةً أن المسافة **' تحد من قدرة تصحيح الخطأ إلى . يحقق كود ريد–سولومون هذا الحد بالمساواة، وبالتالي يمكنه تصحيح ما يصل إلى  أخطاء. ومع ذلك، فإن حد تصحيح الخطأ هذا ليس دقيقًا.

في عام 1999، نشر [[مادو سودان]]  في معهد ماساتشوستس للتكنولوجيا «تحسين فك رموز ريد–سولومون والرموز الجبرية الهندسية» حيث قدموا خوارزمية سمحت بتصحيح الأخطاء التي تتجاوز نصف المسافة الدنيا للرمز. وهذا ينطبق على رموز ريد–سولومون وبشكل عام على [[Algebraic geometric code|الرموز الهندسية الجبرية]]. تنتج هذه الخوارزمية قائمة من الكلمات المشفرة (وهي خوارزمية [[List-decoding|فك تشفير القائمة]]) وتعتمد على الاستيفاء والتحليل إلى عوامل متعددة الحدود على  وامتداداتها.

في عام 2023، بناءً على ثلاثة أحداث مثيرة، أظهر منظرو الترميز أن أكواد ريد–سولومون المحددة عبر نقاط تقييم عشوائية يمكنها في الواقع تحقيق قدرة  (ما يصل إلى  أخطاء) عبر أبجديات ذات حجم خطي باحتمالية عالية. ومع ذلك، فإن هذه النتيجة تركيبية وليست خوارزمية.

=== فك التشفير الناعم ===

إن طرق فك التشفير الجبري الموصوفة أعلاه هي طرق اتخاذ قرار صعب، مما يعني أنه بالنسبة لكل رمز يتم اتخاذ قرار صعب حول قيمته. على سبيل المثال، يمكن لجهاز فك التشفير أن يربط مع كل رمز قيمة إضافية تتوافق مع ثقة [[فك تعديل|جهاز فك تشفير]] القناة في صحة الرمز. لقد أدى ظهور  ، التي تستخدم أساليب فك تشفير انتشار الاعتقاد [[مفكك الترميز ناعم القرار|بقرار ناعم]] متكرر لتحقيق أداء تصحيح الخطأ بالقرب من [[نظرية تكويد القناة الصاخبة|الحد النظري]]، إلى تحفيز الاهتمام بتطبيق فك تشفير القرار الناعم على الرموز الجبرية التقليدية. في عام 2003، قدم رالف كويتر [[ألكسندر فاردي|وألكسندر فاردي]] خوارزمية فك تشفير القائمة الجبرية ذات القرار الناعم في زمن متعدد الحدود لرموز ريد–سولومون، والتي كانت تعتمد على العمل الذي قام به سودان وجورو سوامي. في عام 2016، نشر ستيفن جيه فرانك وجوزيف إتش تايلور فك تشفير القرار الناعم الجديد.

=== مثال ماتلاب ===

==== مُشفِّر ====
نقدم هنا تنفيذ [[ماتلاب]] بسيطًا للمُشفِّر.
<syntaxhighlight lang="matlab" line="1">
function encoded = rsEncoder(msg, m, prim_poly, n, k)
    % RSENCODER Encode message with the Reed-Solomon algorithm
    % m is the number of bits per symbol
    % prim_poly: Primitive polynomial p(x). Ie for DM is 301
    % k is the size of the message
    % n is the total size (k+redundant)
    % Example: msg = uint8('Test')
    % enc_msg = rsEncoder(msg, 8, 301, 12, numel(msg));

    % Get the alpha
    alpha = gf(2, m, prim_poly);

    % Get the Reed-Solomon generating polynomial g(x)
    g_x = genpoly(k, n, alpha);

    % Multiply the information by X^(n-k), or just pad with zeros at the end to
    % get space to add the redundant information
    msg_padded = gf([msg zeros(1, n - k)], m, prim_poly);

    % Get the remainder of the division of the extended message by the
    % Reed-Solomon generating polynomial g(x)
    [~, remainder] = deconv(msg_padded, g_x);

    % Now return the message with the redundant information
    encoded = msg_padded - remainder;

end

% Find the Reed-Solomon generating polynomial g(x), by the way this is the
% same as the rsgenpoly function on matlab
function g = genpoly(k, n, alpha)
    g = 1;
    % A multiplication on the galois field is just a convolution
    for k = mod(1 : n - k, n)
        g = conv(g, [1 alpha .^ (k)]);
    end
end
</syntaxhighlight>

==== فك التشفير ====
الآن الجزء المتعلق بفك التشفير:
<syntaxhighlight lang="matlab" line="1">
function [decoded, error_pos, error_mag, g, S] = rsDecoder(encoded, m, prim_poly, n, k)
    % RSDECODER Decode a Reed-Solomon encoded message
    %   Example:
    % [dec, ~, ~, ~, ~] = rsDecoder(enc_msg, 8, 301, 12, numel(msg))
    max_errors = floor((n - k) / 2);
    orig_vals = encoded.x;
    % Initialize the error vector
    errors = zeros(1, n);
    g = []؛
    S = []؛

    % Get the alpha
    alpha = gf(2, m, prim_poly);

    % Find the syndromes (Check if dividing the message by the generator
    % polynomial the result is zero)
    Synd = polyval(encoded, alpha .^ (1:n - k));
    Syndromes = trim(Synd);

    % If all syndromes are zeros (perfectly divisible) there are no errors
    if isempty(Syndromes.x)
        decoded = orig_vals(1:k);
        error_pos = []؛
        error_mag = []؛
        g = []؛
        S = Synd;
        return;
    end

    % Prepare for the euclidean algorithm (Used to find the error locating
    % polynomials)
    r0 = [1, zeros(1, 2 * max_errors)]؛ r0 = gf(r0, m, prim_poly); r0 = trim(r0);
    size_r0 = length(r0);
    r1 = Syndromes;
    f0 = gf([zeros(1, size_r0 - 1) 1], m, prim_poly);
    f1 = gf(zeros(1, size_r0), m, prim_poly);
    g0 = f1; g1 = f0;

    % Do the euclidean algorithm on the polynomials r0(x) and Syndromes(x) in
    % order to find the error locating polynomial
    while true
        % Do a long division
        [quotient, remainder] = deconv(r0, r1);
        % Add some zeros
        quotient = pad(quotient, length(g1));

        % Find quotient*g1 and pad
        c = conv(quotient, g1);
        c = trim(c);
        c = pad(c, length(g0));

        % Update g as g0-quotient*g1
        g = g0 - c;

        % Check if the degree of remainder(x) is less than max_errors
        if all(remainder(1:end - max_errors) == 0)
            break;
        end

        % Update r0, r1, g0, g1 and remove leading zeros
        r0 = trim(r1); r1 = trim(remainder);
        g0 = g1; g1 = g;
    end

    % Remove leading zeros
    g = trim(g);

    % Find the zeros of the error polynomial on this galois field
    evalPoly = polyval(g, alpha .^ (n - 1 : - 1 : 0));
    error_pos = gf(find(evalPoly == 0), m);

    % If no error position is found we return the received work, because
    % basically is nothing that we could do and we return the received message
    if isempty(error_pos)
        decoded = orig_vals(1:k);
        error_mag = []؛
        return;
    end

    % Prepare a linear system to solve the error polynomial and find the error
    % magnitudes
    size_error = length(error_pos);
    Syndrome_Vals = Syndromes.x;
    b(:, 1) = Syndrome_Vals(1:size_error);
    for idx = 1 : size_error
        e = alpha .^ (idx * (n - error_pos.x));
        err = e.x;
        er(idx, :) = err;
    end

    % Solve the linear system
    error_mag = (gf(er, m, prim_poly) \ gf(b, m, prim_poly))';
    % Put the error magnitude on the error vector
    errors(error_pos.x) = error_mag.x;
    % Bring this vector to the galois field
    errors_gf = gf(errors, m, prim_poly);

    % Now to fix the errors just add with the encoded code
    decoded_gf = encoded(1:k) + errors_gf(1:k);
    decoded = decoded_gf.x;

end

% Remove leading zeros from Galois array
function gt = trim(g)
    gx = g.x;
    gt = gf(gx(find(gx, 1) : end), g.m, g.prim_poly);
end

% Add leading zeros
function xpad = pad(x, k)
    len = length(x);
    if len < k
        xpad = [zeros(1, k - len) x]؛
    end
end
</syntaxhighlight>

== فك تشفير العرض الأصلي لريد سولومون ==

تستخدم أجهزة فك التشفير الموصوفة في هذا القسم مفهوم ريد سولومون الأصلي للكلمة الرمزية كتسلسل من قيم متعددة الحدود، حيث تعتمد متعددة الحدود على الرسالة المراد تشفيرها. تستخدم كل من وحدة التشفير ووحدة فك التشفير نفس مجموعة القيم الثابتة، وتستعيد وحدة فك التشفير متعددة حدود التشفير (واختياريًا متعددة حدود تحديد موقع الخطأ) من الرسالة المستلمة.

=== فك التشفير النظري ===

وصف ريد وسولومون فك تشفير نظري يصحح الأخطاء من خلال العثور على متعدد الحدود للرسالة الأكثر شيوعًا. لا يعرف المُفكك سوى مجموعة القيم <math>a_1</math> ل <math>a_n</math> وأي طريقة ترميز تم استخدامها لتوليد تسلسل قيم الكلمة الرمزية. الرسالة الأصلية، والمتعددة الحدود، وأي أخطاء غير معروفة. يمكن لإجراء فك التشفير استخدام طريقة مثل استيفاء لاغرانج على مجموعات فرعية مختلفة من قيم كلمة المرور n المأخوذة k في كل مرة لإنتاج كثيرات الحدود المحتملة بشكل متكرر، حتى يتم إنتاج عدد كافٍ من كثيرات الحدود المطابقة للقضاء بشكل معقول على أي أخطاء في كلمة المرور المستلمة. بمجرد تحديد كثير الحدود، يمكن تصحيح أي أخطاء في كلمة الرمز، عن طريق إعادة حساب قيم كلمة الرمز المقابلة. لسوء الحظ، في جميع الحالات، باستثناء أبسطها، هناك عدد كبير جدًا من المجموعات الفرعية، وبالتالي فإن الخوارزمية غير عملية. عدد المجموعات الفرعية هو [[معامل ذات الحدين|المعامل الثنائي]]، <math display="inline"> \binom{n}{k} = {n! \over (n-k)! k!}</math>، وعدد المجموعات الفرعية غير ممكن حتى بالنسبة للرموز المتواضعة. بالنسبة لكود  الذي يمكنه تصحيح 3 أخطاء، فإن فك التشفير النظري الساذج سوف يفحص 359 مليار مجموعة فرعية. 

=== فك تشفير بيرليكامب ويلش ===

في عام 1986، تم تطوير فك تشفير معروف باسم  تشفير قادر على استعادة متعددة الحدود الأصلية للرسالة بالإضافة إلى متعددة حدود «محدد» الخطأ التي تنتج أصفارًا لقيم الإدخال التي تتوافق مع الأخطاء، مع تعقيد زمني ، حيث **' هو عدد القيم في الرسالة. يتم بعد ذلك استخدام الحدود المستردة لاستعادة (إعادة الحساب حسب الحاجة) الرسالة الأصلية.

#### الأمثلة
باستخدام آر إس (7,3)، وجي إف (929)، ومجموعة نقاط التقييم 

:

إذا كانت الرسالة متعددة الحدود هي
:

كلمة المرور هي
:

قد يؤدي حدوث أخطاء في الإرسال إلى استلام هذا بدلاً من ذلك.
:

المعادلة الأساسية هي:

:
افترض الحد الأقصى لعدد الأخطاء: . المعادلة الأساسية تصبح:

:

\begin{bmatrix}
001 & 000 & 928 & 000 & 000 & 000 & 000 \\
006 & 006 & 928 & 928 & 928 & 928 & 928 \\
123 & 246 & 928 & 927 & 925 & 921 & 913 \\
456 & 439 & 928 & 926 & 920 & 902 & 848 \\
057 & 228 & 928 & 925 & 913 & 865 & 673 \\
086 & 430 & 928 & 924 & 904 & 804 & 304 \\
121 & 726 & 928 & 923 & 893 & 713 & 562
\end{bmatrix}
\begin{bmatrix}
e_0 \\
e_1 \\
q_0 \\
q_1 \\
q_2 \\
q_3 \\
q_4
\end{bmatrix}
=
\begin{bmatrix}
000 \\
923 \\
437 \\
541 \\
017 \\
637 \\
289
\end{bmatrix}


استخدام الإزالة الغاوسية :


\begin{bmatrix}
001 & 000 & 000 & 000 & 000 & 000 & 000 \\
000 & 001 & 000 & 000 & 000 & 000 & 000 \\
000 & 000 & 001 & 000 & 000 & 000 & 000 \\
000 & 000 & 000 & 001 & 000 & 000 & 000 \\
000 & 000 & 000 & 000 & 001 & 000 & 000 \\
000 & 000 & 000 & 000 & 000 & 001 & 000 \\
000 & 000 & 000 & 000 & 000 & 000 & 001
\end{bmatrix}
\begin{bmatrix}
e_0 \\
e_1 \\
q_0 \\
q_1 \\
q_2 \\
q_3 \\
q_4
\end{bmatrix}
=
\begin{bmatrix}
006 \\
924 \\
006 \\
007 \\
009 \\
916 \\
003
\end{bmatrix}


:
:

:

Recalculate  where  to correct  resulting in the corrected codeword:

:}}

### فك تشفير جاو

في عام 2002، تم تطوير فك تشفير محسن بواسطة شوهونج جاو، استنادًا إلى خوارزمية إقليدس الموسعة.

#### الأمثلة

* R_{-1} = \prod_{i=1}^n (x - a_i)
* R_0 =  استيفاء لاغرانج لـ (a_i, b(a_i)) ل i = 1 ل n
* A_{-1} = 0
* A_{0} = 1
* يولد R_{i} و A_{i} حتى درجة R_{i} ، على سبيل المثال  (n+k)/2 = (7+3)/2 = 5

:

:

لمضاعفة كثيرات الحدود التي أنشأها ويلش بيرليكامب، قسّم *Q* (*x*) و *E* (*x*) على المعامل الأكثر أهمية لـ *E* (*x*) = 708.

:
:

:

Recalculate  where  to correct  resulting in the corrected codeword:

:

## انظر أيضًا
* رمز بي سي إتش

## الملاحظات

## المراجع

## وصلات خارجية
### المعلومات والدروس التعليمية
* 
* 

* Introduction to ريد–سولومون codes: principles, architecture and implementation (CMU)
* 
* 

### التنفيذات
* FEC library in C by Phil Karn (aka KA9Q) includes Reed–Solomon codec, both arbitrary and optimized (223,255) version
* Open Source C++ Reed–Solomon Soft Decoding library
* Matlab implementation of errors and-erasures Reed–Solomon decoding

تصنيف:رصد الأخطاء وتصحيحها
تصنيف:نظرية الترميز