תורת הקבוצות - פונקציות
סדרת הפוסטים שלי על תורת הקבוצות הגיעה עכשיו לשלב שבו אני רוצה להגדיר פורמלית פונקציות. וזה נחמד, כי פונקציה היא אחד מהמושגים המרכזיים במתמטיקה, אם לא המושג המרכזי ביותר, ולכן זו הזדמנות טובה לעצור ולשאול - מה זה בדיוק, הדבר הזה שמופיע בכל מקום?
האינטואיציה שלי היא לחשוב על פונקציה בתור תהליך או בתור כלל שלוקח משהו אחד שאני קורא לו “הקלט” וממיר אותו למשהו אחר שאני קורא לו “הפלט”. למשל \( f\left(x\right)=x^{2} \) זו פונקציה שלוקחת מספר ומעלה אותו בריבוע (כופלת אותו בעצמו) או \( f\left(a\right)=\left\{ a\right\} \) זו פונקציה שלוקחת איבר ומחזירה את הסינגלטון שכולל רק אותו (סינגלטון הוא קבוצה בעלת איבר יחיד). זו אינטואיציה לא רעה. היא גם לא מספיק טובה בשביל ההגדרה שאני רוצה לתת כאן. למה? כי אני רוצה להיות כללי ככל הניתן, ולכן להיות מסוגל לדבר גם על פונקציות שבהן אני לא יכול לזהות “תהליך” ברור או “כלל” מובהק שמגדיר אותן.
בואו נחדד את הנקודה הזו. הפונקציה \( f\left(x\right)=\frac{x^{3}+7}{2x-4} \) היא פונקציה שנתונה לי על ידי נוסחה. מה זו נוסחה? במקרה הזה, הנוסחה מגדירה לי תרגיל חשבוני שלם שצריך לבצע. היא אומרת לי “קח את איקס, תכפול אותו בעצמו פעמיים ותוסיף שבע לתוצאה, שים את התוצאה בצד לרגע, קח את איקס, כפול אותו ב-2 וחסר 4 מהתוצאה, ועכשיו קח את התוצאה המקורית וחלק במה שקיבלת לפני רגע”. שזו דרך ארוכה ומסורבלת להגיד בעברית את מה שהנוסחה אומרת במקוצר (ולכן אנחנו משתמשים בנוסחאות ולא בעברית!) אבל מה שחשוב פה הוא שהנוסחה אומרת במפורש מה לעשות בכל שלב (וכמובן, מתעלמת באלגנטיות מהסכנה של חלוקה באפס שיש כאן - אני אתייחס לנקודה הזו בהמשך).
אבל הנה פונקציה מסוג שונה לגמרי: פונקציה שלוקחת פולינום \( p\left(x_{1},\dots,x_{n}\right) \) במספר כלשהו של משתנים - לאו דווקא משתנה יחיד - עם מקדמים שלמים ומחזירה את המספר 1 אם קיימים מספרים שלמים שאפשר להציב אותם בפולינום כך שיתקבל 0; והיא מחזירה 0 אם לא קיימים מספרים כאלו. פורמלית, \( f\left(p\right)=\begin{cases} 1 & \exists a\in\mathbb{Z}^{n}:P\left(a\right)=0\\ 0 & \text{else} \end{cases} \). הפונקציה הזו עדיין מתארת, לכאורה, תהליך כלשהו: לוקחים את \( p \), בודקים איכשהו אם אפשר לאפס אותו ככה או לא, ואז מחזירים 1 או 0 בהתאם. העניין הוא שאין תהליך שעושה את זה במובן הסטנדרטי שאנחנו רגילים לחשוב עליו: אין אלגוריתם שפותר את הבעיה הזו, שנקראת הבעיה העשירית של הילברט והקדשתי לה בשעתו סדרת פוסטים בבלוג בדיוק כדי שנראה שהיא לא פתירה.
אפשר, כמובן, לטעון שפונקציות שאין לנו תיאור מפורש של תהליך שמחשב אותן הן לא מעניינות, אבל אותי הן כן מעניינות! בפרט, איך בדיוק אפשר לדעת מראש אם פונקציה כלשהי היא ניתנת לחישוב או לא? בשביל להיווכח בכך שהבעיה העשירית של הילברט בלתי פתירה נדרשו שבעים שנים בערך והמצאה של כל תורת החישוביות. אז לא, בואו נעזוב את האינטואיציה שפונקציה אמורה לתאר במפורש איך היא מחשבת את מה שהיא מחשבת.
בסדר גמור, אתם אומרים. אז “תהליך” לא צריך, אבל “כלל” עדיין יש - עבור הבעיה העשירית של הילברט אתה נתת במפורש כלל שהיה פשוט למדי לניסוח וכולנו מבינים מה הוא אומר. מעולה! אז הנה לכם בעיה חדשה. ניקח את המספרים הממשיים, \( \mathbb{R} \), ונסתכל על אוסף כל תת-הקבוצות שלהם, \( \mathcal{P}\left(\mathbb{R}\right) \). מהאוסף הזה נוריד את הקבוצה הריקה, ועכשיו נדבר על פונקציה שהקלט שלה הוא קבוצה \( A \) מתוך האוסף - כלומר, קבוצה לא ריקה של ממשיים - והפלט שלה על הקלט הזה הוא איבר כלשהו מתוך הקבוצה.
אוקיי, אבל איזו פונקציה? נאמר, מה הפונקציה מחזירה עבור הקבוצה \( \left\{ 1,2\right\} \)? היא יכולה להחזיר כל אחד משניהם, אנחנו חייבים להחליט מה מהם היא מחזירה אם אנחנו רוצים לדבר על פונקציה קונקרטית ולא על אוסף גדול של פונקציות אפשריות. אז נניח שהחלטנו שהיא מחזירה 1. אבל עכשיו נשאלת השאלה מה היא מחזירה עבור הקבוצה \( \left\{ \pi,17,523\right\} \) וכן הלאה. אם היה מדובר, נאמר, על קבוצות של מספרים טבעיים היה קל לתת כלל שיגיד מה לעשות בכל מקרה אפשרי - פשוט להחזיר את האיבר המינימלי בכל קבוצה. אבל בקבוצות של ממשיים לאו דווקא יש איבר מינימלי, וגם טריקים מתוחכמים יותר שיעבדו עבור הרציונליים לא יעבדו פה. אז מה עושים?
התשובה היא שלא עושים. להוכיח שלא עושים זה מסובך מאוד ולא ניכנס לזה כאן, אבל פשוט אי אפשר לתת תיאור מפורש של פונקציה כזו. תחת זאת, אנחנו מניחים שקיימת כזו, כאקסיומה. ואם אנחנו מדברים על האינטואיציות, אז האינטואיציה פה היא שזה מאוד, מאוד מוזר. כלומר - כל מה שהפונקציה צריכה לעשות הוא להחזיר איברים מתוך קבוצות לא ריקות, לא? אז הנה, היא קיבלה קבוצה לא ריקה. יש שם איברים שאפשר להחזיר. אז למה שהיא לא פשוט… תחזיר? אחד מהם? לא חשוב איזה? אבל זה בדיוק מקרה שבו אין “כלל”. מקרה שבו אנחנו רוצים לדבר על פונקציה גם בלי שום דרך טובה להסביר מה בעצם היא עושה מעבר לכך שאנחנו יכולים לדבר על קשר כלשהו בין הקלט והפלט שלה.
אז כשאני בא להגדיר את המושג של פונקציה, אני לוקח את האינטואיציה של “תהליך או כלל שהופך קלט לפלט” ופשוט מעיף ממנה את ה”תהליך”. אני משאיר את הקלט ואת הפלט. כלומר - פורמלית פונקציה מ-\( A \) אל \( B \) הולכת להיות אוסף של זוגות מהצורה \( \left(a,b\right) \) כך ש-\( a\in A \) ו-\( b\in B \). לדבר הזה יש שם: זה יחס מ-\( A \) אל \( B \); תת-קבוצה של \( A\times B \). אבל לא כל יחס יכול להיחשב פונקציה - בואו נחשוב לרגע מה אנחנו כן רוצים שיתקיים מבחינת יחסי קלט/פלט.
ובכן, כשאני מדמיין אינטואיטיבית פונקציה אני חושב על משהו שלוקח קלט, עושה לו קרחחצבופינצינקי ואז מוציא פלט. לא מעניין אותי ה-“קרחחצבופינצינקי” אבל אני במובלע מניח שהוא מקבל בברכה כל קלט ותמיד מוציא לו פלט מתאים, ושזה תמיד אותו פלט. במילים אחרות, אני לא מדמיין את אדון קרחחצבופינצינקי אומר פתאום “עזבו אותי מהשיעמום הזה אני הולך הביתה” ומסרב לתת לי פלט מתאים עבור קלט כלשהו; ואני גם לא מדמיין את אדון קרחחצבופינצינקי אומר “מה לבחור מה לבחור מה לבחור פשוט אטיל קוביה ונראה מה היא תגיד”.
בשלב הזה אתם עשויים להזדעק - למה אני מייחס לאדון קרחחצבופינצינקי כאלו דברים? מה, אנחנו לא מכירים תוכניות מחשב שיש קלטים שהן פשוט נתקעות עליהם ולא מוציאות פלט? מה, אנחנו לא מכירים תוכניות מחשב שהפלט שלהן הוא אקראי? מה, הטבע אינו אקראי? אם אני מודד מצב קוונטי אני לא אקבל תוצאות שונות בהסתברויות שונות? מה זו הגישה הצרה והמוגבלת הזו לתיאור המציאות? שוב המתמטיקאים עם השטויות שלהם?
ובכן, זוכרים איך כבר בפוסט הראשון על תורת הקבוצות דיברנו על חיסרון מהותי דומה של קבוצות - זה שאין בהן סדר? ודקה אחר כך ראינו שדווקא אפשר ליצור סדר מתוך החוסר-סדר הזה של קבוצות? אותו הדבר עם פונקציות - גם אם נדרוש שלכל קלט יהיה פלט יחיד, עדיין נוכל להגדיר בהמשך סוגים מתוחכמים יותר של פונקציות בעזרת הפורמליזם הבסיסי הזה. נגיע לכך עוד מעט, ובינתיים הנה ההגדרה הפורמלית הסופית לפונקציה.
פונקציה \( f:A\to B \) מורכבת משלושה דברים: קבוצה \( A \) שנקראת התחום של הפונקציה, קבוצה \( B \) שנקראת הטווח של הפונקציה, ויחס \( f\subseteq A\times B \) שאותו לרוב אני פשוט מכנה “הפונקציה” וזהו. היחס הזה צריך לקיים שתי תכונות:
- "קיום": לכל \( a\in A \) קיים \( b\in B \) כך ש-\( \left(a,b\right)\in f \).
- "יחידות": אם \( \left(a,b_{1}\right)\in f \) וגם \( \left(a,b_{2}\right)\in f \) עבור \( a\in A \) ו-\( b_{1},b_{2}\in B \) אז \( b_{1}=b_{2} \).
שתי התכונות הללו מאפשרות לי להשתמש בקיצור הנפוץ ביותר במתמטיקה. במקום לכתוב \( \left(a,b\right)\in f \) אני יכול לכתוב \( b=f\left(a\right) \) או פשוט לשכוח מ-\( b \) ופשוט לסמן \( f\left(a\right) \) כדי להגיד “האיבר היחיד ב-\( B \) שנמצא ביחס \( f \) עם \( a \)” (קיים כזה כי 1 והוא יחיד כי 2).
הנקודה הראשונה והנודניקית שאני רוצה להדגיש הוא שהתחום והטווח חשובים. שתי פונקציות שמוגדרות על ידי אותו “כלל” אבל הן עם תחומים שונים או טווחים שונים נחשבות שונות. למשל לכתוב \( f\left(x\right)=x^{2} \) לא נותן לנו את כל האינפורמציה על הפונקציה. אם \( f:\mathbb{N}\to\mathbb{N} \), כלומר התחום והטווח הם הטבעיים, אז ברור שזו פונקציה שונה מ-\( g:\mathbb{R}\to\mathbb{R} \) המוגדרת על ידי \( g\left(x\right)=x^{2} \) גם כן; הרי הזוג \( \left(\frac{1}{2},\frac{1}{4}\right) \) שייך ל-\( g \) ולא שייך ל-\( f \). אלא שיש גם סיטואציות הרבה יותר עדינות. בואו נסתכל על \( f:\mathbb{R}\to\mathbb{R} \) המוגדרת על ידי \( f\left(x\right)=x^{2} \) אל מול \( g:\mathbb{R}\to[0,\infty( \) המוגדרת על ידי \( g\left(x\right)=x^{2} \). כאן \( [0,\infty( \) הוא קבוצת כל הממשיים האי-שליליים. מה קורה פה? אם מעלים מספר ממשי בריבוע, התוצאה היא תמיד מספר אי שלילי. כלומר הטווח של \( f \) שהוא כל \( \mathbb{R} \) הוא בעצם “לא מנוצל כולו” כי אנחנו אף פעם לא מחזירים מספר שלילי. יותר מכך - היחסים \( f \) ו-\( g \) הם שווים כי הם מכילים בדיוק את אותם איברים. ועדיין, \( f \) היא לא אותה פונקציה כמו \( g \) כי הן נבדלות בטווח שלהן ולא משנה שלא משתמשים בחלק הנוסף של הטווח.
אם לא תמיד משתמשים בכל הטווח, נראה שיש ערך גם לדבר על אותו חלק של הטווח שבו כן משתמשים - הוא נקרא התמונה של \( f \) והוא מסומן לעתים קרובות ב-\( f\left(A\right)=\left\{ f\left(a\right)\ |\ a\in A\right\} \) (או בסימון הפחות מעניין \( \text{Im}f \)). הסימון הזה יכול להיות קצת מבלבל כי נראה כאילו מזינים ל-\( f \) את הקבוצה \( A \) בתור קלט, כשבעצם מתכוונים ל”הקבוצה שמתקבלת כשמזינים ל-\( f \) בתור קלט את כל האיברים ב-\( A \)” אבל לפני שמתרעמים על חילול הקודש כדאי לזכור שגם הסימון \( f\left(a\right) \) בעצמו הוא רק סימון מקוצר למשהו, כך שאין בעיה עקרונית עם לכתוב \( f\left(A\right) \) ואפילו מרחיבים אותו לכל תת-קבוצה של \( A \) (כלומר, אם \( X\subseteq A \) אז כותבים \( f\left(X\right) \) כדי לתאר את \( \left\{ f\left(x\right)\ |\ x\in X\right\} \)). כן קיים מקרה אחד שבו הסימון הזה עשוי להיות מסוכן - אם איברים של \( A \) הם גם תת-קבוצות של \( A \), וזה בהחלט מקרה שנראה בהמשך - ובמקרה הזה באמת לא נשתמש בשיטת הסימון הזו.
עכשיו בואו נעבור לדבר על המגבלות לכאורה של ההגדרה הזו ולמה הן לא באמת מגבלות. נתחיל דווקא עם זו שאולי נראית פחות קריטית: על פניו, לפונקציה שלי יש משתנה בודד, וזהו. זה כמובן לא המצב באופן כללי. בחדו”א למשל אחרי שגומרים להבין את הבסיס של החדו”א של פונקציות במשתנה יחיד עוברים לדבר על פונקציות בשני משתנים שכותבים בתור \( f\left(x,y\right) \). איך זה מסתדר עם ההגדרה שלנו? ובכן, בקלות: אם אני מגדיר \( f:\mathbb{R}^{2}\to\mathbb{R} \) (\( \mathbb{R}^{2} \) הוא סימון מקוצר למכפלה הקרטזית \( \mathbb{R}\times\mathbb{R} \)), הגדרתי פונקציה שהקלט שלה הוא זוג איברים: כלומר, אני צריך לכתוב \( f\left(\left(x,y\right)\right) \) כדי לתאר את הקלט. מכיוון ש-\( f \) הוא מלכתחילה סימון מטעמי נוחות, אני פשוט כותב \( f\left(x,y\right) \) במקום לכתוב \( f\left(\left(x,y\right)\right) \) וחסל. באופן דומה בחדו”א עוברים לדבר אחר כך על פונקציה שמקבלת \( n \) קלטים ומחזירה סדרה של \( m \) ערכים - זו פשוט פונקציה \( f:\mathbb{R}^{n}\to\mathbb{R}^{m} \), אז אין בעיה עם זה. למעשה, באלגברה לינארית כבר משלב מוקדם מאוד עובדים עם פונקציות מרובות משתנים שכאלו, רק שבאלגברה לינארית על פי רוב כן ממשיכים להתייחס לאיבר \( \left(x_{1},\ldots,x_{n}\right) \) בתור איבר בודד שהוא סדרה של \( n \) ערכים ולא בתור \( n \) איברים.
המגבלה הבאה היא שפונקציה לא יכולה להיות לא מוגדרת עבור ערך כלשהו מתוך התחום שלה. את זה קל לתקן מאוד בקלות על ידי הרחבה של הטווח. נוסיף לטווח איבר חדש שנסמן נניח ב-\( \perp \), ואז נגדיר את \( f \) להחזיר את \( \perp \) על כל איבר של התחום שהיא לא מוגדרת עבורו. זו קונבנציה סטנדרטית שאפשר לראות, למשל, בספרים של תורת החישוביות, שעוסקים בדיוק בחישובים שעשויים לא להסתיים ולכן לא להחזיר פלט. לפונקציה שלא מוגדרת על כל התחום קוראים שם “פונקציה לא מלאה” וכפי שראינו עכשיו אין בעיה להגדיר אותה פורמלית בעזרת המושג הרגיל של פונקציה.
תכונת היחידות מעלה בעיה אחרת. האם לפעמים אנחנו רוצים שהפונקציה תחזיר יותר מפלט אחד? ובכן, כמובן: נאמר שאנחנו רוצים פונקציה שלוקחת מספר טבעי ומחזירה את הפירוק שלו לגורמים ראשוניים, אז למשל \( f\left(6\right)=\left(2,3\right) \). אבל לא באמת החזרנו כאן שני פלטים; החזרנו פלט שהוא סדרה של שני איברים, ובזה הפורמליזם הקיים שלנו של קבוצות כבר מטפל יפה.
בואו נחדד את הסיטואציה הבעייתית עם דוגמא אחרת - פונקציית השורש, \( f:[0,\infty)\to\mathbb{R} \), \( f\left(x\right)=\sqrt{x} \). מהו “שורש” של מספר? קונספטואלית, השורש של \( a \) הוא מספר \( x \) כך ש-\( x^{2}=a \). העניין הוא שבמספרים הממשיים למספר יכולים להיות שני שורשים: למשל, עבור 4, מתקיים גם \( 2^{2}=4 \) וגם \( \left(-2\right)^{2}=4 \). יש גם את הבעיה שאין שורש ממשי למספרים שליליים אבל כאן פשוט בחרתי את התחום לא לכלול אותם.
אם כן, לפונקציית השורש יש על פי רוב שני פלטים שונים שהיא יכולה להחזיר. הם לא אותו אובייקט; הם שתי אפשרויות אלטרנטיביות לתשובה שכל אחת מהן טובה באותה מידה. ואנחנו צריכים להחזיר אחת מהן. אז מה עושים? פשוט בוחרים באופן שרירותי משהו את מה לעשות - המוסכמה היא שהפונקציה \( f\left(x\right)=\sqrt{x} \) תמיד תחזיר את השורש החיובי ולא את השלילי (תמיד יש אחד כזה ואחד כזה אם יש שניים). אם היינו בוחרים תמיד להחזיר את השלילי היינו מקבלים פונקציה חוקית באותה מידה, וגם אם היינו בוחרים מדי פעם להחזיר את החיובי ומדי פעם את השלילי, כל עוד הכלל של מתי בוחרים מה להחזיר היה מוגדר היטב.
העניין הוא שאם מבצעים תהליך כזה של “לבחור איזה מהערכים האפשריים של הפונקציה לקחת” אנחנו רוצים גם להיות מסוגלים לדבר על הפונקציה שממנה מתחילים את התהליך הזה. מקום שבו זה נפוץ במיוחד הוא בתורת הפונקציות המרוכבות, שם התופעה של פונקציה שמחזירה הרבה ערכים היא נפוצה מאוד. אז קוראים לפונקציה כזו “פונקציה רב-ערכית”. ואיך פורמלית מטפלים בזה? אם הפונקציה \( f:A\to B \) היא רב-ערכית, אפשר לחשוב עליה פורמלית בתור פונקציה \( f:A\to\mathcal{P}\left(B\right) \). כלומר, במקום שהיא תחזיר איבר בודד של \( B \) היא מחזירה תת-קבוצה של \( B \). פתרון די פשוט. עכשיו אפשר לקחת את הפונקציה הזו ולצמצם אותה כך שתחזיר רק פלט אחד בפעם - לפעולה הזו קוראים לקיחת ענף של הפונקציה. בתורת הפונקציות המרוכבות מתחיל עכשיו סיפור די מרתק של מה קורה אם מנסים לקחת ענף תוך שמירה על תכונות נחמדות של הפונקציה, אבל אנחנו לא מדברים על התחום הזה כרגע אז אני אימלט ממנו לפני שתשימו לב שאני לא באמת מבין על מה אני מדבר.
והנה דוגמא מתחום שונה לגמרי - תורת האוטומטים. בשביל להבין את הדוגמא לא צריך להבין אוטומטים מעבר לכך שהם מורכבים מקבוצה של מצבים \( Q \) שאפשר להיות בהם, קבוצה של אותיות קלט \( \Sigma \) שאפשר לראות, ופונקציה \( \delta:Q\times\Sigma\to Q \) שבהינתן מצב ואות קלט קובעת לאיזה מצב חדש האוטומט צריך לעבור (הנה דוגמא לפונקציה בשני משתנים!)
המושג הזה של אוטומט נקרא אוטומט דטרמיניסטי כי בהינתן הזוג של מצב + אות קלט, המצב שאליו עוברים נקבע באופן יחיד. אבל בפועל נוח להרחיב את סוג האוטומט הזה לאוטומט לא דטרמיניסטי שמותר לו לבצע כמה מעברים שונים בתגובה לאותו זוג של מצב ואות קלט (הפרה של תכונת ה”יחידות”), או לא לבצע מעבר בכלל (הפרה של תכונת ה”קיום”). פורמלית קל לטפל בזה: פונקצית המעברים הופכת להיות \( \delta:Q\times\Sigma\to\mathcal{P}\left(Q\right) \) שלכל זוג קלטים מחזיר את קבוצת כל הפלטים האפשרית עבורם (כאן “אף מעבר” מתואר על ידי פלט שהוא הקבוצה הריקה). בגלל כל מני קשיים טכניים שההגדרה הזו מעוררת לפעמים פשוט בוחרים בשלב הזה לדבר על יחס מעברים במקום על פונקציית מעברים - כלומר, לחזור למקורות שבהם פונקציה היא סוג של יחס עם תכונות מסויימות ופשוט לוותר על התכונות הללו - אבל לא נתעסק בזה כאן.
נקודה אחת אחרונה שאני רוצה לדבר עליה היא מה עשוי להשתבש כשמגדירים פונקציה בלי שנשים לב אפילו. כמו שהפרדוקס של ראסל לימד אותנו, זה שאנחנו כותבים אוסף אקראי של מילים בעברית לא אומר שיצרנו קבוצה, וכך גם בפונקציות - זה שכתבתי כלל כלשהו לא אומר שבאמת הגדרתי פונקציה. צריך לוודא את זה, ולו בינינו לבין עצמנו.
הבעיה הפשוטה ביותר שצריך לחשוש ממנה היא פשוט שהכלל לא יעבוד לכל הקלטים, ולכן יהיה קלט נטול פלט ותכונת ה”קיום” שלנו תתקלקל. למשל, \( f:\mathbb{R}\to\mathbb{R} \) המוגדרת על ידי \( f\left(x\right)=\frac{1}{x} \) איננה פונקציה כי עבור \( x=0 \) אין משמעות לביטוי \( \frac{1}{x} \) שכתבנו כך בקלילות. כמובן, קל לתקן את זה על ידי שינוי של התחום (כלומר, להוציא את 0 מהתחום: \( f:\mathbb{R}\backslash\left\{ 0\right\} \to\mathbb{R} \)) או על ידי שינוי של הטווח (כמו שאמרתי קודם, להגדיר \( f:\mathbb{R}\to\mathbb{R}\cup\left\{ \perp\right\} \) ו-\( f\left(0\right)=\perp \)) אבל בלי אחד מהשינויים הללו, אין לנו פה פונקציה גם אם אנחנו חושבים בטעות שיש.
עוד בעיות קלאסיות עם הגדרות חסרות משמעות של פונקציות הן כשמציבים אפס או מספר שלילי בפונקציית הלוגריתם (\( \ln0 \)), כשמנסים לתת לפונקציה טריגונומטרית הפוכה ערך שאינו בין \( -1 \) ל-1 (\( \sin^{-1}\left(\pi\right) \)), כשמנסים להוציא שורש למספר שלילי מעל הממשיים (\( \sqrt{-1} \); כאן אפשר להרחיב את הטווח באופן סביר והגיוני לקבוצת המרוכבים, \( \mathbb{C} \), במקום סתם לומר שאנחנו לא מוגדרים, אבל לפעמים אנחנו לא רוצים לערב את המרוכבים בסיפור) וכדומה. על פי רוב אין יותר מדי סכנות מהסוג הזה - צריך לדעת על כמה דברים בסיסיים שיש להיזהר מהם, וזה מספיק.
סכנה גדולה בהרבה אורבת לנו דווקא עם תכונת ה”יחידות”. הסיבה לכך היא שבמתמטיקה לעתים קרובות יש לאובייקט מתמטי יותר מייצוג אחד וכשמגדירים פונקציה על האובייקט צריך להיזהר שהפונקציה לא תוגדר באופן שהוא תלוי ייצוג - כלומר, שעבור ייצוגים שונים לאותו קלט לא יתקבלו פלטים שונים.
הנה דוגמא פשוטה לאיך שזה יכול לצוץ כשמשתמשים ביחסי שקילות. בפוסט על יחסי שקילות הצגתי יחס שקילות שסימנתי אותו ב-\( \equiv_{3} \): אמרתי ש-\( a\equiv_{3}b \) אם השארית ש-\( a,b \) משאירים בחלוקה ב-3 היא זהה. למשל, \( 1\equiv_{3}4 \). לכן אפשר לכתוב \( \left[1\right]=\left[4\right] \) - מחלקת השקילות של 1 ומחלקת השקילות של 4 הן אותה מחלקת שקילות.
עכשיו בואו נגדיר פונקציה מקבוצת המנה \( \mathbb{N}/\equiv_{3} \) אל \( \mathbb{N} \) באופן הבא: \( f\left(\left[a\right]\right)=a \). כלומר: בהינתן מחלקת שקילות שמיוצגת על ידי המספר הטבעי \( a \), הפונקציה מחזירה את \( a \). למשל, \( f\left(\left[0\right]\right)=0 \) ו-\( f\left(\left[1\right]\right)=1 \) ו-\( f\left(\left[2\right]\right)=2 \) ו-\( f\left(\left[4\right]\right)=4 \) ו… אה-הא! הנה הבעיה. הרי \( \left[1\right]=\left[4\right] \) אבל כרגע ראינו שני פלטים שונים על אותו קלט: \( f\left(\left[1\right]\right)=1\ne4=f\left(\left[4\right]\right) \). זו סתירה לתכונת ה”יחידות” של פונקציה, וזה קרה לנו בלי לשים לב, בזמן שניסינו להגדיר את הפונקציה באמצעות נוסחה “רגילה” שלא נראית רב-ערכית.
אז מה הפתרון? אין פתרון קסם, צריך להיות זהירים. גם בהוכחות מתקדמות במתמטיקה לא כזה נדיר, כשמוגדרת פונקציה, לראות שלב בהוכחה שבו מראים שהפונקציה היא “מוגדרת היטב”. כלומר, אם יש ספק כלשהו לגבי תכונת ה”קיום” או ה”יחידות”, מסבירים במפורש למה אין בעיה.
אז זהו זה לגבי מה שרציתי להגיד על מה זו פונקציה בכלל, ועכשיו הגיע הזמן להתחיל לעשות איתן דברים מעניינים.
נהניתם? התעניינתם? אם תרצו, אתם מוזמנים לתת טיפ: