עבודה עם מספרים גדולים.
אני צריך לממש מחלקה המתעסקת עם מספרים גדולים. במילה גדולים, כוונתי היא שמספר הספרות לא מוגבל, והוא יכול להגיע למאות ואף לאלפים. מה שמיממשתי עד כה הוא מחלקה המכילה רשימה מקושרת דו כיוונית של מספרים, כל אחד בן 16 ביטים, המייצגים ביחד את המספר. כאשר מבקשים לבצע פעולת חיבור, עוברים מהימני ביותר (LSB) ועד לשמאלי ביותר, ומבצעים חיבור כמו בכיתה ב', כאשר מעבירים CARRY מאחד לשני. כפל מתבצע באופן דומה, ע"פ האלגוריתם של כפל ארוך, וגם חיסור או השוואה אינם בעייתיים. הבעיה שנתקלתי בה היא כאשר אני מנסה לבצע פעולות כמו מודולו או חילוק, שבהן זמן הריצה הוא O של N בריבוע, כאשר N הוא מספר הביטים, ועבור N בסדר גודל של כמה אלפים, זה יכול לקחת כמה שניות טובות לבצע פעולת מודולו. יש לכם רעיון איך מבצעים מודולו (או חילוק - באמצעות חילוק, חיסור, כפל וחיבור, אין בעיה לממש מודולו) בזמן לינארי ביחס למספר הביטים? (ההודעה המקורית היתה בפורום שפות תכנות, http://www.tapuz.co.il/tapuzforum/main/addmsg.asp?id=1428 אולם שם לא קיבלתי שום רעיון).
אני צריך לממש מחלקה המתעסקת עם מספרים גדולים. במילה גדולים, כוונתי היא שמספר הספרות לא מוגבל, והוא יכול להגיע למאות ואף לאלפים. מה שמיממשתי עד כה הוא מחלקה המכילה רשימה מקושרת דו כיוונית של מספרים, כל אחד בן 16 ביטים, המייצגים ביחד את המספר. כאשר מבקשים לבצע פעולת חיבור, עוברים מהימני ביותר (LSB) ועד לשמאלי ביותר, ומבצעים חיבור כמו בכיתה ב', כאשר מעבירים CARRY מאחד לשני. כפל מתבצע באופן דומה, ע"פ האלגוריתם של כפל ארוך, וגם חיסור או השוואה אינם בעייתיים. הבעיה שנתקלתי בה היא כאשר אני מנסה לבצע פעולות כמו מודולו או חילוק, שבהן זמן הריצה הוא O של N בריבוע, כאשר N הוא מספר הביטים, ועבור N בסדר גודל של כמה אלפים, זה יכול לקחת כמה שניות טובות לבצע פעולת מודולו. יש לכם רעיון איך מבצעים מודולו (או חילוק - באמצעות חילוק, חיסור, כפל וחיבור, אין בעיה לממש מודולו) בזמן לינארי ביחס למספר הביטים? (ההודעה המקורית היתה בפורום שפות תכנות, http://www.tapuz.co.il/tapuzforum/main/addmsg.asp?id=1428 אולם שם לא קיבלתי שום רעיון).