קידוד

מטרת הקידוד היא זיהוי ותיקון שגיאות בתהליך העברת המידע .דוגמא: כאשר נשלח מידע כלשהו (רצף של ביטים), נרצה לדעת שלא נפלה טעות בדרך. לשם כך, נוכל לשלוח את אותו המידע פעמיים. כך, מובטח שאם ביט אחד שובש, שתי פיסות המידע לא יהיו תקינות ונוכל לזהות שגיאה. אך, לא נוכל לדעת לתקן את השגיאה. לשם כך, נוכל לשלוח שלושה רצפים אחד אחרי השני, ובכך אם נפלה טעות אחד נוכל לתקן. נשים לב שזה לא פרקטי על מנת לזהות ולתקן שגיאות היינו צריכים להכפיל ואף לשלש את המידע.

קוד, מילה ויתירות

  1. קוד הוא תת קבוצה של Z2m כלומר קבוצה של וקטורים בינאריים באורך m.
  2. מילה היא איבר בקבוצה xZ2m . מילה תמיד מורכבת מ יתירות+מידע כאשר המידע והיתירות הן וקטורים בינארים מגדלים k,n כך ש k+n=m .

מילה נקראת חוקית כאשר היא קידוד של מידע כלשהו, כלומר ישנו איזשהו קופסה שחורה ״המקודד״ שיודע לקחת את המילה ולחלץ ממנה מידע. מילה לא חוקית משמעותה שנפלה שגיאה.

parity check

מזהה האם כמות השגיאות היא אי זוגית. אם היא זוגית לא נזהה את השגיאה.
נניח שהמידע שלנו הוא v=(x1,x2,xn) ונגדיר את המילה המקודדת כ u=(x1,xn,i=1nxi) כאשר הסכום הוא היתירות. לאחר העברת מידע ישנה מילה שמתקבלת בצד השני, נסמנה כ u=(y1,y2,,yn+1) . נשים לב ש:

x1++xn+i=1nxi=2i=1nxi20

חשוב: כל המתמטיקה היא מעל חוג השאריות מסדר 2
אם המילה המתקבלת שווה למילה שנשלחה כלומר u=u יתקיים

i=1nyi=2i=1nxi20

טכניקה זאת מוכרת גם בשם Checksum

שגיאה

נזכר ש ei=(0,,1i,0) ונגדיר שגיאה באינדקס i להיות u+ei . כעת במצב של שגיאה אחת יתקיים u=u+ei כלומר

u=x1++(xi+1)++j=1nxj=1

כלומר ניתן לראות שבמצב שבו יש שגיאה אחת (או מספר שגיאות אי זוגי), התוצאה של הסכימה תהיה 1 ולכן נוכל לזהות שגיאות כאשר מספר השגיאות הוא אי זוגי. אם לעומת זאת מספר השגיאות הוא זוגי נקבל בסכימה 0 שזה כמו שנקבל במצב שאין שגיאות בכלל ולכן לא נזהה.

קידוד ליניארי

נגדיר קידוד ליניארי עם מטריצות. נסתכל על AZ2k×m . ניצור ממנה את זוג המטריצות הבא

G=(ImA)    H=(A  Ik)

כאשר G היא המטריצה המקודדת ו H היא המטריצה המפענת.

המידע הוא vZ2m כלומר וקטור בגודל כמות עמודות המטריצה A והיתירות היא באורך k כמות שורות המטריצה A .
המילה המקודדת היא Gv כלומר

u=Gv=(IA)v=(vAv)

כעת בנינו את המילה הנשלחת. איך מקודדים אותה ומזהים שגיאות?

הבחנה

אוסף המילים החוקיות הוא Im(G) כלומר כל המילים Gv

הצד השני בדומה לשיטה של בדיקת זוגיות, מקבל u ומחשב Hu במטרה לקבל וקטור 0.
טענה: תהי מילה uZ2k+m אזי

vZ2m:u=GvHu=0

כלומר- קוד ליניארי הוא בעצם N(H) כלומר מרחב האפס של המטריצה H.

הוכחה-
: נניח u=Gv אזי

HG=(A I)(IA)=AI+AI=2AI20

סך הכל נקבל שלכל v

HGv=0v=0

: נניח Hu=0 , יהי v כלשהו והמילה הנשלחת u=(vx) כדי ש u תהיה מילה חוקית צריך להראות ש x=Av . אכן:

Hu=(A  I)(vx)=Av+x=0in Z2Av=x
נשיב לב

מסקנה מההוכחה הזאת היא שיתירות של מילה u היא יחידה והיא תמיד Av

דוגמה:
A=(1111) , נשים לב שכמות העמודות = אורך המידע , כמות השורות = אורך היתירות, אם כן

G=(10000100001000011111)

ו v=(abcd) ומתקיים

Gv=G(abcd)=(abcda+b+c+d)

כיצד שגיאות משפיעות על התהליך?
נניח והתקבלה שגיאה אחת כלומר המילה שהגיע לצד השני היא u=u+ei ויתקיים

Hu=H(u+ei)=Hu+Hei=Ci(H)

כלומר נזהה כל שגיאה יחידה אמ״מ ב H אין עמודות אפסים (שזה שקול לדרישה שב A לא יהיו עמודות 0). אם למשל העמודה ה i ב H הייתה 0 במקרה הנ״ל עדיין היינו מקבלים בתוצאה 0 שזה לא טוב.

מה לגבי שתי שגיאות? ei,ej יתקיים

Hu=H(u+ei+ej)=Ci(H)+Cj(H)

אם אלו היו זהות אז היינו מקבלים 0 גם כן בגלל שאנחנו מעל השדה מודולו 2. ולכן נזהה 2 שגיאות אמ״מ ב H אין זוג עמודות זהות.

מסקנה

אם אין עמודות אפסים ב H ואין 2 עמודות זהות, במצב זה נזהה כל 2 שגיאות ונוכל לתקן שגיאה יחידה

שאלה:
בהינתן k ביטי יתירות מה יהיה אורך המידע הגדול ביותר עבורו H תהיה ללא עומדת אפסים וללא זוג עמודות זהות?
זוהי שאלה קומבינטורית , אם יש k ביטי יתירות זה אומר שיש k שורות ב A כלומר כל עמודה יכולה להחזיק בתוכה k ערכים ולכן יש 2k צירופים שונים לבניית עמודה (כולל עמודות האפסים.) כמו כן נשים לב ש H מורכבת מ k עמודות יחידה ולכן גם הן תפוסות לנו, סך הכל אורך המידע הגדול ביותר עבורו H תהיה ללא עמודות אפסים וללא זוג עמודות זהו הוא

m=2k1k

דוגמה נניח שיש 3 ביטי יתירות האפשרויות לעמודות של A הן

A=(101111010111)

כי 2313=4 . ולכן H תיראה ככה

H=(101110011010100111001)

מרחק המינג

מרחק המינג היא בעייה ידועה בעולם האלגוריתמים. נוכל לראות איך היא עוזרת לנו לפתור בעיות הקשורות לקידוד.

משקל המינג:
נגיד משקל המינג של וקטור vZ2n להיות מספר האחדות שבו.
מרחק המינג:
מרחק המינג d(u,v) בין שני וקטורים הוא מספר השורות השונות בינהם. בגלל שאנחנו מעל שדה המודולו 2, ניתן לחשב את הנ״ל על ידי חישוב משקל המינג של uv .

דוגמה-
עבור (1100),(0111) יתקיים שמרחק המינג שלהם הוא

(1 1 0 0)(0 1 1 1)=(1 0 1 1)

הגדרה- המרחק dmin של קוד הוא המרחק המינימלי בין שתי מילות קוד שונות.

טענה 1- בקוד ליניארי המרחק dmin שווה למשקל המינימלי של מילות קוד שאינן וקטור האפס.
טענה 2- יהי C קוד ליניארי עם מרחק dmin. אם dmin2d+1 כאשר d מספר כלשהו אז C יצליח לזהות 2d שגיאות ולתקן d שגיאות אמ״מ אין ב H המטריצה שהמילות החוקיות שייכות למרחב ה0 שלה היא מטריצה בלי עמודת 0 ובלי עמודות זהות.

דוגמה-
תהי המטריצה

H=(111001001011001)

נחשב את dmin של הקוד שהוא מרחב האפסים של H . ונראה כמה שגיאות ניתו להזות ולתקן.

נשים לב שסכימה של העמודות C1+C2+C4 תניב 0 כלומר יש וקטור v ששייך למרחב האפסים של H (כלומר הוא מילת קוד) והוא

Hv=(111001001011001)(11010)=0

המשקל של וקטור זה הוא 3 ולכן dmin3 . לפי הטענה הקודמה אנחנו יודעים ש dmin3 אמ״מ אין במטריצה עמודת אפסים או עמודות זהות וזה בידיוק המצב אצלנו לכן dmin=3 . כלומר במצב זה ניתן לזהות עד שתי שגיאות ולתקן שגיאה אחת.

כיצד מתקנים שגיאה?
נניח ואירעה שגיאה אחת בידיוק במילת קוד v. כפי שאמרנו התוצאה שנקבל היא העמודה ה i של H ולכן נוכל לדעת שהשגיאה קרתה בסיבית ה i של v וכדי לתקן נוכל פשוט להחזיר לצד המקבל את

(v+ei)+ei2v

קידוד פולינומי

נעסוק כעת בחוג הפולינומים מעל Z2 . איבר בחוג נראה ככה

a0+a1x++an1xn

כאשר המקדמים הם בינאריים.
נתרגם בין וקטורים בינאריים לפולינומים וההיפך לפי המקדמים למשל

x4+x3+x11010

כלומר מידע הוא מחרוזת בינארית שמתורגמת לפולינום כזה. אם מעבירים k ביטים של מידע אז דרגת פולינום המידע היא k1 .

משפט : יהי f,g פולינומים מעל Z2[x] אזי קיימים פולינומים יחידים q,r כך ש

f=qg+r

ומתקיים deg(r)<deg(g).

תהליך הקידוד הפולינומי

יהי g פולינום מדרגה m (m מייצג את אורך היתירות) ויהי f פולינום מידע ומדרגה חסומה k1 .
נחשב

xmf

כדי להזיז את המידע m ביטים בשביל לתת מקום ליתירות.
נחלק

xmf¬g

היתירות היא שארית החלוקה r(x) כלומר היתירות יחידה. סך הכל המילה היא

xmf+r

טענה: מילים הן חוקיות אמ״מ הן מתחלקות ב g .
הוכחה-

xmf=qg+rxmf+r=qg

דוגמה:

Pasted image 20230304174539.png|500

קודים ציקליים

יהי וקטור בינארי (a0,a1,,an1) הזזה ציקלית שלו היא (an1,a0,a1,,an1) .
קוד נקרא ציקלי אם כל הזזה ציקלית של מילה חוקית היא גם מילה חוקית.

למה צריך קוד ציקלי?

היתירות עבור כל מילה היא ייחודית. ולכן כל שגיאה תהפוך את היתירות להיות יתירות שלא מתאימה למילה. מכיוון שניתן לעשות הזזות בקוד ציקלי נוכל להעביר את 𝑚 הביטים עם הטעות להיות ביטי היתירות וכך נוכל לזהות שישנה שגיאה.

למשל:
עבור 01101001 הזזה ציקלית אחת תביא אותנו ל 11010010 ומתקיים

x7+x6+x4+x=x(x6+x5+x3+1)
נשים לב

לא מבצעים את ההזזות בפועל כי כשנגדיל את הפולינומים יהיו המון הזזות ונרצה דרך שונה לבדוק האם מילה היא חוקית או לא. אנחנו רק הוכחנו שאם ההזזה תביא למילה לא חוקית אז ניתן לזהות שגיאות.

טענה: עבור קוד ציקלי ומילה חוקית u נניח ש u התקבלה על ידי טעויות בטווח של m ביטים. אזי u איננה חוקית.
הוכחה- נב״ש ששתיהן חוקיות, נבצע הזזות של u ו u כך שכל השגיאות ב u יהיו ב m הביטים האחרונים. נקבל שתי מילים חוקיות הנבדלות רק ביתירות, בסתירה .

טענה: הכפלה של פולינום ב xk שקולה לביצוע shift על המחרוזת הבינארית.

הזזה ציקלית באופן אלגברי

נתאר את פעולת ההזזה הציקלית באופן אלגבי: u=an1xn1++a0 .

  1. אם an1=0 אז ההזזה היא w=an2xn1++a0x ומתקיים w=xu .
  2. אם an1=1 אז xu=xn+an2xn1++a0x , יש xn מיותר וחסר אחד ולכן ההזזה הציקלית הנכונה היא xu+xn+1=an2xn1++a0x+1 .

משפט: יהי g מדרגה m ונביט בקידוד של k ביטי מידע. נסמן n=k+m ויתקיים
הקוד ציקלי אמ״מ g מחלק של xn+1