Έτερος εγώ

Το έτερος εγώ είναι μια Ελληνική ταινία του 2016 η οποία είναι πρωτοποριακή
για τα Ελληνικά Δεδομένα. Με εξαιρετική σκηνοθεσία και ερμηνείες, μα πάνω απο
όλα με ένα ιδιαίτερο σενάριο. Βασική ιδέα της ταινίας στηρίζεται στην θεωρία των
Φίλιων αριθμών. Των αριθμών που είναι φίλοι.
   Ποιοι όμως ονομάζονται φίλιοι αριθμοί?
Τι είναι φίλος; Αυτός που είναι ο άλλος σου εαυτός, όπως το 220 με το 284.
Τι ενώνει άραγε τους αριθμούς 220 και 284; Οι αριθμοί αυτοί είναι φίλοι γιατί
ο ένας καθρεφτίζεται μέσα στον άλλο. Το άθροισμα των γνησίων διαιρετών του 220 ισούται με 284, ενώ το άθροισμα των γνησίων διαιρετών του 284 ισούται με 220.
Δυο αριθμοί ονομάζονται φίλιοι, αν ο πρώτος ισούται με το άθροισμα των γνήσιων
διαιρετών του δεύτερου και αντίστροφα. Αυτή η σχέση μεταξύ των αριθμών είναι ικανή για να θεωρήσουν οι Πυθαγόρειοι αυτούς τους αριθμούς ως “φίλιους”, δηλαδή ως “αγαπημένους”.
Στα Αγγλικά ονομάζονται Amicable Numbers. Πρώτη αναφορά για αυτούς τους αριθμούς έχουμε από τον Πυθαγόρα. Αργότερα ασχολήθηκαν με αυτούς οι Άραβες μαθηματικοί του Μεσαίωνα, και στα νεότερα χρόνια οι μεγάλοι Μαθηματικοί Descartes, Fermat και Euler.
Την σημερινή εποχή με την βοήθεια των ηλεκτρονικών υπολογιστών έχουν βρεθεί πάρα πολλά ζευγάρια φίλιων αριθμών. Δεν έχει βρεθεί κάποια φόρμουλα που να μπορεί να τους παράγει και επίσης δεν έχουμε αποδείξει αν είναι άπειρα η πεπερασμένα τα ζευγάρια των φίλιων αριθμών. Τα πρώτα ζευγάρια τέτοιων αριθμών είναι τα:
220-284,

1184-1210,

2620-2924,

5020-5564,

6232-6368,

10744-10856, κτλ.

Παρόλο που παραπάνω βλέπουμε μόνο ζυγούς, δεν αποτελεί πανάκεια, υπάρχουν και ζευγάρια φίλιων αριθμών που περιλαμβάνουν μονούς αριθμούς. Ωστόσο δεν γνωρίζω αν υπάρχουν ζευγάρια που ο ένας να είναι περιττός αριθμός και ο άλλος άρτιος. Πιθανόν να υπάρχει σχετική απόδειξη ή κάποιο αντιπαράδειγμα. Μέχρι το 100.000 υπάρχουν μόνο 13 ζευγάρια φίλιοι αριθμοί.
Οι φίλιοι αριθμοί φαίνονται πολύ γοητευτικοί και για αυτό πιθανόν κινητοποίησαν την
φαντασία των αρχαίων και των νεότερων μαθηματικών, αν και πιθανόν να μην έχουν κάποια χρήσιμη εφαρμογή ακόμα. Οι ερωτευμένοι με τα μαθηματικά αξίζει να τους αφιερώσουν κάποιο χρόνο, είναι βέβαιο ότι θα τους συναρπάσουν.

Παρακάτω παραθέτω τρία προγράμματα που υλοποίησα για την ανεύρεση ζευγαριών Φίλιων Αριθμών. Το πρώτο πρόγραμμα είναι υλοποιημένο σε ΓΛΩΣΣΑ (μπορούμε να το αναθέσουμε ως άσκηση και στους μαθητές μας), το δεύτερο πρόγραμμα είναι υλοποιημένο σε Python, και τέλος το τρίτο πρόγραμμα είναι υλοποιημένο στον βασιλιά της ταχύτητας, σε γλώσσα προγραμματισμού C. Εκτελώντας τα προγράμματα βλέπετε και την χαοτική διαφορά του χρόνου εκτέλεσης μεταξύ της ΓΛΩΣΣΑΣ και της Python και της C, αν και ούτε η Python είναι αρκετά γρήγορη. Αυτό δείχνει αφενός την πολυπλοκότητα της διαδικασίας ειδικά όσο οι αριθμοί γίνονται μεγαλύτεροι και αφετέρου φανερώνει πως ο compiler της ΓΛΩΣΣΑΣ στην ουσία δεν είναι μεταγλωττιστής αλλά ψευδο-μεταγλωττιστής υψηλού επιπέδου. Περισσότερο θα το χαρακτήριζα ως πρόγραμμα προσομοίωσης. Η ΓΛΩΣΣΑ βρίσκει τους φίλιους αριθμούς ως το 20.000 σε περίπου μια ώρα, η Python σε 5 λεπτά ενώ η C σε 3 δευτερόλεπτα!!!!
θα επανέλθω στο θέμα με έναν νέο πιο αποδοτικό αλγόριθμο, διότι ο κάτωθι υλοποιημένος είναι με την λογική του greedy (Εξαντλητικός Αλγόριθμος) και ασφαλώς δεν είναι αποδοτικός.

ΓΛΩΣΣΑ


ΠΡΟΓΡΑΜΜΑ ΦΙΛΙΟΙ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Χ, ΑΠΟΤΕΛΕΣΜΑ, ΑΠΟΤΕΛΕΣΜΑ2
ΑΡΧΗ

ΓΙΑ Χ ΑΠΟ 6 ΜΕΧΡΙ 10000
ΚΑΛΕΣΕ Δ1(Χ, ΑΠΟΤΕΛΕΣΜΑ)
ΑΝ ΑΠΟΤΕΛΕΣΜΑ <> Χ ΤΟΤΕ
ΚΑΛΕΣΕ Δ1(ΑΠΟΤΕΛΕΣΜΑ, ΑΠΟΤΕΛΕΣΜΑ2)
ΑΝ Χ = ΑΠΟΤΕΛΕΣΜΑ2 ΤΟΤΕ
ΓΡΑΨΕ Χ, ‘ ‘, ΑΠΟΤΕΛΕΣΜΑ
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ Δ1(Χ, Υ)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Χ, Υ, Ι
ΑΡΧΗ
Υ <- 0
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ (Χ div 2)
ΑΝ Χ mod Ι = 0 ΤΟΤΕ
Υ <- Υ + Ι
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

Python

def d1(x):
y = 0
i = 1
while i <= (x//2):
if x % i == 0:
y = y + i
i = i + 1
return y

x = 6
while x <= 100000:
ap = d1(x)
if (ap != x) and (ap % 2 == 0):
ap2 = d1(ap)
if x == ap2:
print(x, ‘ ‘, ap)

x = x + 1

C

#include <stdio.h>
int main() {
int i,x,y;
for (i = 0; i < 20000; i++) {
x = d1(i);
if (x != i) {
y = d1(x);
if (i == y) {
printf(“%d – %d\n”, y, x);
}
}
}

printf(“Hello, World!”);
return 0;
}

int d1(int a) {
int i, temp;
temp = 0;
i = 1;
while (i <= (a / 2) ) {
if ((a % i) == 0) {
temp = temp + i;
}
i = i + 1;
}
return temp;
}


Κατηγορίες: ΑΕΠΠ, Αρχαίοι, Μαθηματικά, Πληροφορική, Πρόβλημα. Προσθήκη στους σελιδοδείκτες.