You are on page 1of 9

‫جلسة العملي الرابعة‪ :‬ترميز المصدر‬

‫الهدف من الجلسة‪:‬‬
‫‪ ‬توليد سالسل نصية بتوزع احتمالي محدد‬
‫‪ ‬ترميز المصدر المحرفي األمثلي ‪ :‬متوسط طول الترميز يحقق المتراجحة‪H(X) <= Lc< H(X) +1 :‬‬
‫‪ ‬حساب متوسط طول ترميز محرفي‬
‫‪ ‬ترميز المصدر المحرفي األمثلي هو ترميز هوفمان‬

‫‪ 1‬التمرين األول‪ :‬توليد سلسلة نصية بحسب شعاع توزع احتمال من أبجدية محددة‬
‫اكتب تابع ‪ chardata‬يولد سلسلة عشوائية من المحارف‪.‬‬
‫سنكتب نسخة عامة بحيث يأخذ التابع ‪ chardata‬كدخل‪:‬‬
‫‪ ‬مجموعة المحارف (أبجدية) ‪ alphabet‬التي نريد تشكيل نص منها‬
‫‪ ‬التوزع االحتمالي ‪ p‬التي نريد أن نولد المحارف بحسبها‬
‫‪ ‬طول سلسلة الخرج ‪ n‬المراد توليدها عشوائيا ً‬
‫ويعيد كخرج‪ :‬ش‪XX‬عاع مح‪XX‬ارف (نص ‪ )text‬طول‪XX‬ه ‪ n‬مك‪XX‬ون من المح‪XX‬ارف الموج‪XX‬ودة في ‪ alphabet‬بحيث نس‪XX‬بة‬
‫تكرار (ورود) كل حرف فيه يخضع للنسب المدخلة في شعاع التوزيع االحتمالي للمحارف‬
‫الحظ أن شعاع األبجدية ‪ alphabet‬وشعاع التوزع االحتمالي ‪ p‬يجب أن يكونوا من نفس الطول‬

‫)‪function text=chardata(alphabet,p,n‬‬
‫‪%alphabet is the sample space‬‬
‫‪%p is the probability distribution vector‬‬
‫‪%n number of sample to be generated‬‬

‫‪%text is a vector of character from the alphabet with the probability p‬‬

‫;)‪N=length(alphabet‬‬
‫)‪if N~=length(p‬‬
‫)'‪error('p and alphabet are not of the same length‬‬
‫‪end‬‬

‫))‪if or((sum(p)~=1) , (min(p)<0‬‬


‫)'‪error('p is not a valid probability distribution vector‬‬
‫‪end‬‬

‫‪% calculating the cumulative probability vector‬‬


‫‪for i=1:N‬‬
‫))‪cumulative_p(i)=sum(p(1:i‬‬
‫‪end‬‬

‫‪1‬‬
‫;)‪x=rand(1,n‬‬

‫‪for i=1:n‬‬
‫‪for j=1:N‬‬
‫‪if x(i)<cumulative_p(j) % checking in which sub-interval x(i) lies‬‬
‫;)‪text(i)=alphabet(j‬‬
‫‪break‬‬
‫;‪end‬‬
‫‪end‬‬
‫‪end‬‬

‫االستدعاء‪:‬‬
‫]‪>>ps=[1/2 1/4 1/8 1/8‬‬
‫]'‪>>alphabet=['a','b','c','d‬‬
‫;)‪>>texts=chardata(alphabet,ps,1000‬‬

‫كيف نتأكد أن نسبة ورود المحارف في السلسلة المشكلة هي بحسب االحتماالت التي تم إدخالها في شعاع‬
‫التوزيع؟‬
‫نعد عدد مرات ورود كل حرف‬
‫))’‪>>length(find(texts =’a‬‬
‫))’‪>>length(find(texts =’b‬‬
‫‪ ‬فسر األرقام التي تحصل عليها‪ ،‬لماذا ال نستطيع رسم الهيستوغرام؟‬
‫ألن تابع الرسم ‪ bar‬ال يأخذ شعاع محارف كقيم للمحور ‪x‬‬
‫الحل أن نرسم عدد مرات ورود كل حرف بداللة ترتيب الحرف في األبجدية‬
‫كيف نحصل على ترتيب الحرف؟ بأخذ ‪ ascii‬ك‪XX‬ود للح‪XX‬رف (بتحوي‪XX‬ل الح‪XX‬رف إلى نم‪XX‬ط ‪ )uint8‬وط‪XX‬رح‬
‫‪ ascii‬كود ألول حرف الذي هو ‪ a‬وإضافة ‪( 1‬من أجل أتن يكون ترتيبت الحرف ‪ a‬هو ‪ , 1‬وليس ‪(0‬‬
‫أضف الكود التالي إلى تابع ‪myhist‬‬
‫‪if ischar(samples) % is the samples are of class char: characters‬‬
‫‪si=uint8(samples)-uint8('a');% si is the index of each character sample‬‬
‫‪else‬‬
‫;‪si=samples‬‬
‫‪end‬‬
‫‪bar(si,f) % plot f as a function of‬‬ ‫‪600‬‬
‫‪samples as bars‬‬
‫استدعي التابع ‪myhist‬‬ ‫‪500‬‬

‫;)‪>>[s,f]=myhist(texts‬‬ ‫‪400‬‬

‫‪300‬‬

‫‪200‬‬

‫‪2 100‬‬

‫‪0‬‬
‫‪0.5‬‬ ‫‪1‬‬ ‫‪1.5‬‬ ‫‪2‬‬ ‫‪2.5‬‬ ‫‪3‬‬ ‫‪3.5‬‬ ‫‪4‬‬ ‫‪4.5‬‬
‫التمرين الثاني‪ :‬ترميز مصدر رباعي‬ ‫‪2‬‬

‫نريد توليد سلسلة من ‪ 1000‬حرف (مشكلة من األحرف ['‪ ]'a','b','c','d‬وبنسب ورود يحددها المستخدم عبر‬
‫تمرير شعاع التوزيع االحتمالي للمحارف) ومن ثم نريد ترميز هذه السلسة بحسب الترميز‪:‬‬
‫رمزه‬ ‫المحرف‬
‫‪0‬‬ ‫‪a‬‬
‫‪10‬‬ ‫‪b‬‬
‫‪110‬‬ ‫‪c‬‬
‫‪111‬‬ ‫‪d‬‬
‫‪ ‬اكتب تابع ‪ encoder‬يأخذ كدخل سلسلة من المحارف وترم‪X‬يز ‪ c‬ومجموع‪X‬ة المح‪X‬ارف ال‪X‬تي يتش‪X‬كل منه‪X‬ا‬
‫النص ويعيد السلسلة بعد ترميزها‬
‫لنكتب تابع يقوم بترميز سلسلة نصية بحسب الترميز ‪ c‬يمرره المستخدم‬
‫الحظ أن بنية المعطيات لتمثيل الترميز (العمود الثاني في جدول الترميز) هو شعاع عناصره أشعة‪ ،‬في الماتالب‬
‫تسمى هذه البنية بـ ‪ ،cell array‬فمثالً لتمثيل الترميز في الجدول السابق‪:‬‬
‫}]‪>>c2={0,[1 0],[1 1 0], [1 1 1‬‬
‫ويكون }‪ c{1‬هو رمز أول نحرف‪:‬‬
‫}‪>>c2{1‬‬
‫لمعرفة من هو أول محرف يجب تعريف مجموعة المحارف ‪alphabet‬‬
‫]'‪>>alphabet=['a','b','c','d‬‬

‫الحظ أننا نستطيع أن ندمج شعاع ‪ alphabet‬و الترميز ‪ c‬في ‪ cell array‬واحد‬

‫;‪>> c2={'a',0‬‬
‫;]‪'b',[1 0‬‬
‫;]‪'c',[1 1 0‬‬
‫}]‪'d',[1 1 1‬‬
‫وفي هذه الحالة يكفي تمرير هذه الترميز بدون مجموعة األبجدية (طبعا ً يجب تعديل التابع التالي بحيث يأخذ البنية‬
‫الجديد للترميز المكون من عمودين ‪ ،‬عمود للمحارف وعمود لقيم ترميز المحارف‬
‫لنكتب اآلن التابع ‪ encoder‬الذي يقوم بترميز سلسلة نصية ‪ text‬بحسب ترميز (يسمى أيضا ً قاموس)‬
‫مثالً إذا كان لدينا الترميز ‪ c2‬السابق و السلسلة التالية‪:‬‬

‫’‪text=’dacab‬‬
‫فإن هذ التابع سوف يعيد السلسلة المرمزة لهذا النص (باستبدال كل حرف بترميزه)‬
‫‪1110110010‬‬
‫الحظ أن السلسلة التالية هي عبارة عن شعاع من البتات‬
‫‪3‬‬
function enco=encoder(text,alphabet,c)
%text: is the text to be encoded
%alphabet: sample space
%c: code cell array

enco=[];
%enco={};

for i=1:length(text)
j=find(text(i)==alphabet);% the order of the current character in the alphabet
enco=[enco c{j}];%take the code of this character and add it to the enco vector
%enco{i}=c{j};
end

‫إذا استخدمنا البنية الثانية للترميز حيث يحوي الترميز األبجدية في العمود األول وقيم الترميز في العمود الثاني‬
:‫يكون التابع كالتالي‬
function enco=encoder(text, c)
%text: is the text to be encoded
%c: code cell array:
% column 1 is the alphabet
% column 2 is the code of the alphabet
%enco is the output encoded vector: vector of bits
enco=[];
[N,M]=size(c);% N is the number of samples in the alphabet, M is 2

for i=1:length(text) % take every character in the text and find it's code
for j=1:N% searching loop
if text(i)==c{j,1}% if the current character of the text is the sample in the j row
enco=[enco c{j,2}];%take the code of this character from the second
column of the same row and add it to the previous encoded vector
break
end
end
end

>>enco1s=encoder(texts,c1)

4
‫مقارنة بين شجرة البحث ‪ 1‬وشجرة البحث ‪:2‬‬ ‫‪3‬‬

‫الشجرة (‪)2‬‬ ‫الشجرة (‪)1‬‬

‫الحظ أن الشجرة (‪ )1‬هي عبارة عن ترميز هوفمان عندما يكون التوزع االحتمالي للمصدر توزع منتظم‬

‫‪a ..0.25………… 0.25‬‬ ‫‪0‬‬ ‫‪0.5‬‬ ‫‪0‬‬


‫‪1‬‬
‫‪b..0.25………… 0.25‬‬ ‫‪1‬‬
‫‪1‬‬
‫‪0‬‬
‫‪c..0.25‬‬ ‫‪0.5………………0.5‬‬
‫‪1‬‬
‫‪d..0.25‬‬

‫الحظ أن الشجرة (‪ )2‬هي عبارة عن ترميز هوفمان عندما يكون التوزع االحتمالي للمصدر هو [‬
‫‪( ]1/2,1/4,1/8,1/8‬هذه حالة خاصة ليست دوما ً شجرة البحث الثنائي الموزنة (والتي هي ترميز شانون فانو)‬
‫هي شجرة هوفمان)‬

‫‪a ..1/2………… 1/2 ………….. 1/2‬‬ ‫‪0‬‬

‫…………‪b..1/4‬‬ ‫‪1/4‬‬ ‫‪1‬‬ ‫‪0‬‬


‫‪1‬‬
‫‪1‬‬ ‫‪0‬‬
‫‪c..1/8‬‬ ‫‪1/4‬‬ ‫‪1/2‬‬
‫‪1‬‬
‫‪d..1/8‬‬

‫‪5‬‬
‫رمزه‬ ‫المحرف‬ ‫رمزه‬ ‫المحرف‬
‫‪00‬‬ ‫‪a‬‬ ‫‪0‬‬ ‫‪a‬‬
‫‪01‬‬ ‫‪b‬‬ ‫‪10‬‬ ‫‪b‬‬
‫‪10‬‬ ‫‪c‬‬ ‫‪110‬‬ ‫‪c‬‬
‫‪11‬‬ ‫‪d‬‬ ‫‪111‬‬ ‫‪d‬‬
‫الترميز‪2 X‬‬ ‫الترميز‪1 X‬‬

‫}]‪c1={'a',[0 0];'b',[0 1];'c',[1 0];'d',[1 1‬‬


‫}]‪c2={'a',0;'b',[1 0];'c',[1 1 0];'d',[1 1 1‬‬
‫سوف نولد نصين عشوائيين من األبجدية ]’‪ alpha=[‘a’,’b’,’c’,’d‬النص األول بحسب التوزع المنتظم‬ ‫‪.1‬‬
‫والنص الثاني بحسب التوزع ]‪ps=[1/2,1/4,/1/8,/1/8‬‬
‫]'‪alphabet=['a','b','c','d‬‬
‫‪Pu=1/4*ones(1,4); %uniform probability vector‬‬
‫‪Ps=[1/2 1/4 1/8 1/8]; %non uniform probability vector‬‬

‫‪texts=chardata(alphabet,Ps,1000); );% random text with non uniform distribution‬‬


‫‪textu=chardata(alphabet,Pu,1000); % random text with uniform distribution‬‬

‫سوف نرمز النص المنتظم مرتين‪ ،‬األولى باستخدام الترميز ‪ ، 1c‬والثانية بالترميز ‪c2‬‬ ‫‪.2‬‬
‫ونحسب المتوسط (اإلحصائي) لعدد البتات للحرف الواحد في كل سلسلة من السلستين المرمزتين (المتوسط‬
‫هو طول السلسلة بالبتات تقسيم عدد األحرف التي ترمزها السلسلة الذي في حالتنا هو ‪ 1000‬حرف)‬
‫الترميز الذي يعطي أقل متوسط هو األفضل‬
‫)‪enco1u=encoder(textu, c1‬‬
‫)‪enco2u=encoder(textu, c2‬‬

‫‪lc1u=length(enco2u)/length(textu) % statistical mean of c1 when the distribution is‬‬


‫‪uniform‬‬

‫‪lc2u=length(enco2u)/length(textu) % statistical mean of c2 when the distribution is‬‬


‫‪uniform‬‬

‫طول السلسة المرمزة بحسب ‪ c1 : 2000‬بت تماما ً‬


‫متوسط طول الترميز ‪ c1:2‬بت للمحرف تماما ً‬
‫طول السلسة المرمزة بحسب ‪ c2 : 2250‬بت تقريبا ً‬
‫متوسط طول الترميز ‪ c:2.25‬بت للمحرف تقريبا ً‬

‫‪6‬‬
‫سوف نرمز النص ذو التوزع ‪ Ps‬غير المنتظم مرتين‪ ،‬األولى باستخدام الترميز ‪ ، 1c‬والثانية بالترميز ‪c2‬‬ ‫‪.3‬‬
‫ونحسب المتوسطين‬
‫)‪enco1s=encoder(texts, c1‬‬
‫)‪enco2s=encoder(texts, c2‬‬

‫‪lc1s=length(enco1s)/length(texts) % statistical mean of c1 when encoding a text‬‬


‫‪with Ps distribution‬‬
‫‪lc2s=length(enco2s)/length(texts) % statistical mean of c2 when encoding a text‬‬
‫‪with Ps distribution‬‬

‫طول السلسة المرمزة بحسب ‪ c1 : 2000‬بت تماما ً‬


‫متوسط طول الترميز ‪ c1 : 2‬بت للمحرف‬
‫طول السلسة المرمزة بحسب ‪ c2 : 1750‬بت تقريبا ً‬
‫متوسط طول الترميز ‪ c2‬تقريبا ً‪ 1.75‬بت للمحرف الواحد‬

‫‪ .4‬فسر النتائج السابقة؟ ماذا تستنتج؟‬


‫‪ ‬بحسب الشجرة ‪( 1‬الترميز ‪ )c1‬كل محرف طول ترميزه ‪ li‬هو ‪ 2‬بت بغض النظر عن احتماله‪ ،‬وبالتالي‬
‫متوسط طول الترميز ‪ c1‬هو ‪ 2‬بت ‪ ،‬وأيضا ً طول السلسلة المرمزة لـ ‪ 1000‬محرف هو ‪ 2000‬بت‬
‫تماما ً أيا ً كان التوزع االحتمالي للمحارف (منتظم أم غير منتظم)‬
‫‪ ‬بحسب الشجرة ‪( 2‬الترميز ‪ )c2‬كل محرف طول ترميزه ‪ li‬مختلف (شعاع األطوال للترميز ‪ c2‬هو‬
‫]‪ L2=[1,2,3,3‬فمتوسط طوله يختلف باختالف التوزع االحتمالي‬
‫❑‬
‫) ‪L C=∑ P (x i ) .l (x i‬‬ ‫‪‬‬
‫‪i‬‬

‫في حالة التوزع المنتظم يكون ‪ p(xi)=1/4‬وبالتالي‪:‬‬


‫‪1‬‬ ‫‪9‬‬
‫‪Lc 2 u= ∗( 1+2+3+3 )= =2.25bit /char‬‬
‫‪4‬‬ ‫‪4‬‬
‫في حالة التوزع غير المنتظم ]‪ Ps=[1/2,1/4,1/8,1/8‬يكون‪:‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪Lc 2 s= ∗1+ ∗2+ ∗3+ ∗3=1.75bit /char‬‬
‫‪2‬‬ ‫‪4‬‬ ‫‪8‬‬ ‫‪8‬‬

‫‪Pu=[1/4 1/4 1/4 1/4];% uniform distribution‬‬


‫‪Ps=[1/2 1/4 1/8 1/8];% non uniform distribution‬‬
‫‪L1=[2 2 2 2]; % length in bit of each character in c1 code‬‬
‫‪L2=[1 2 3 3]; % length in bit of each character in c2 code‬‬

‫)‪Lc1u=sum(L1.*Pu‬‬
‫)‪Lc1s=sum(L1.*Ps‬‬
‫)‪Lc2u=sum(L2.*Pu‬‬
‫)‪Lc2s=sum(L2.*Ps‬‬

‫‪7‬‬
‫خالصة‪:‬‬
‫‪ .1‬في حالة الت وزع المنتظم ‪ : Pu‬الترم يز ‪ c1‬ق د أعطى أداء أفض ل (من أج ل الت وزع المنتظم متوس ط عم ق‬
‫الشجرة ‪ 1‬هو ‪ 2‬بت أقل من متوسط عمق الشجرة ‪ 2‬الذي هو ‪ 2.25‬بت)‪.‬‬
‫‪ .2‬في حالة الت وزع غ ير المنتظم ‪ : Ps‬الش جرة ‪ 2‬ك ان أداءه ا أفض ل حيث أن متوس ط عمقه ا ك ان ‪ 1.75‬بت‬
‫مقابل ‪ 2‬بت للشجرة ‪.1‬‬
‫‪ .3‬مع تغير التوزع االحتمالي يتغير األنتروبي للمص در‪ ،‬وبالت الي ش جرة الترم يز األمثلي (هوفم ان) ومتوس ط‬
‫طول الترميز األمثلي يتغير‪ ،‬حيث يجب أن ال يتجاوز اإلنتروبي‪.‬‬
‫‪ .4‬من أجل التوزع االحتمالي المنتظم يكون اإلنتروبي أعظمي‪ ،‬وأي ش جرة ترم يز لن تعطي أداء أفض ل (ط ول‬
‫ترميز أقصر) من شجرة بحث ثنائية غير موزنة (الشجرة ‪ )1‬حيث أن عمقها يس اوي إلى أن تروبي المص در‬
‫)‪ ،log(N‬وبالتالي ال يمكن ضغط المصدر‪.‬‬
‫‪ .5‬عندما تكون احتماالت المحارف تكتب بقوى ‪ 2‬السالبة عندها يكون متوسط طول الترميز األمثلي (هوفم ان)‬
‫يساوي اإلنتروبي (برهن على ذلك رياضيا‪ ،‬م ا هي العالق ة بين ط ول الرم ز واحتمال ه في ه ذه الحال ة؟) ‪،‬‬
‫ويكون ترميز هوفمان هو نفسه ترميز فانو وهو نفسه شجرة بحث ثنائية موزنة‪.‬‬
‫‪ .6‬لذلك نرى أن الفرق بين إنتروبي المصدر واإلنتروبي األعظمي (عندما نخزن ‪ 4‬محارف ال نعرف احتماالتها‬
‫نفترض أسوء حالة وهي أن توزعها منتظم فنرمزها بحسب الشجرة‪ ،‬فإذا كان توزعه ا غ ير منتظم ا ً نك ون‬
‫هنالك حشو "فائض") ‪ ،‬يدل على إمكانية ضغط المص در‪ ،‬ويس مى ه ذا الف رق بالـ "حش و" (أو الف ائض)‬
‫‪ ،redundancy‬فالمصادر التي قيمة ‪ redundancy‬لها ‪ 0‬ال يمكن ضغطها (لماذا؟)‬
‫‪ .7‬إذا ك ان ل دينا أبجدي ة من ‪ N‬مح رف وال نع رف توزعه ا االحتم الي نرم ز ك ل ح رف على )‪ log2(N‬بت‬
‫ونفترض أسوء حالة (من ناحية طول الترم يز ال ذي نحتاج ه) وهي أن الت وزع منتظم ونك ون ب ذلك أعطين ا‬
‫طول متساوي لجميع المحارف‪ ،‬فإذا كان توزعها الفعلي بعيداً عن التوزع المنتظم (ماذا يعني بعيد؟ أي قيمة‬
‫عالية لـ )‪ )D(p||q‬يكون لدينا حشو كبير‪ ،‬وبالتالي يمكن إعادة ترميزه ا (الض غط ه و عملي ة تغ ير ترم يز‬
‫المحارف من ش كل إلى أخ ر فمثالً نحن نغ ير ترم يز الح رف ‘‪ ’a‬من ‪ ascii‬إلى ترم يز بحس ب ‪ )c1‬بحس ب‬
‫ترميز هوفم ان األمثلي ال ذي يعتم د على أن نعطي المح ارف األعلى احتم االً (األك ثر وروداً) كلم ات ترم يز‬
‫قصيرة أما المحارف األقل احتماالً فنعطيها كلمات ترميز طويلة (أي نعطي كل كحرف عدد من البتات بحس ب‬
‫كمية معلومات شانون له (ما هي؟))‪.‬‬

‫‪8‬‬
‫احسب اإلنتروبي للتوزعين‪ ،‬و قارن مع طول الشجرة األمثلية في كل حالة‬ ‫‪.8‬‬
‫‪Hu=-sum(Pu.*log2(Pu))% entropy of the source when the probability vector is‬‬
‫)‪uniform=max Entropy=log2(N‬‬
‫‪Hs=-sum(Ps.*log2(Ps))% entropy of the source when the probability vector non‬‬
‫‪uniform PS‬‬

‫التمرين الرابع ‪ :‬تطبيق االحتماالت في فك التشفير‬ ‫‪4‬‬


‫أبسط طريقة لتشفير المحارف هي االستبدال‪ ،‬حيث نستبدل مجموعة من المحارف بمجموعة أخرى‪ .‬تعرف هذه‬
‫الطريقة بـ ‪ . César encryption‬كيف يمكن كسر هذا التشفير؟‬
‫توليد مفتاح تشفير عشوائي بطول محدد‪ :‬اكتب تابع يأخذ من المستخدم طول المفتاح ويعيد مقتاح تشفير‬ ‫‪.1‬‬
‫عشوائي الستخدامه في تشفير االستبدال‬
‫المشفر‪ :‬قم بكتابة تابع يأخذ سلسلة نصية مكتوبة بلغة إنكليزية ومفتاح استبدال‪ ،‬ويعيد سلسلة الدخل بعد‬ ‫‪.2‬‬
‫تشفيرها باستبدال كل محرف فيها بالمرحف الموافق في المفتاح‬
‫فك التشفير‪ :‬اكتب تابع معاكس للتابع السابق‪ ،‬حيث يأخذ كدخل سلسلة نصية مشفرة ومفتاح التشفير‬ ‫‪.3‬‬
‫ويعيد السلسلة األصلية قبل التشفير‬
‫كسر التشفير ‪ :cracking the cipher‬اكتب تابع يأخذ سلسلة مشفرة ويعيد جزء من مفتاح التشفير عبر‬ ‫‪.4‬‬
‫محاولة كسر التشفير باستخدام االحتماالت القياسية لورود المحارف في اللغة اإلنكليزية؟‬
‫‪Mono-alphabetic encryption is a type of encryption which substitutes a letter, character, or number with‬‬
‫‪a random letter, character, or number. However, each "replacement" character can only be used for‬‬
‫‪that one character. It's an easy way to hide a message from your "average joe" to keep your messages‬‬
‫‪safe.‬‬

‫‪9‬‬

You might also like