div και mod με αρνητικους

Ξεκίνησε από apanagio, 08 Δεκ 2014, 09:19:43 ΠΜ

« προηγούμενο - επόμενο »

apanagio

Όπως έχει συζητηθεί κι εδώ:
https://alkisg.mysch.gr/steki/index.php?topic=755.0
η συμπεριφορά των div και mod ίσως να ξενίζει τους μαθητές μας όταν τα ορίσματα είναι αρνητικοί αριθμοί.

Σύμφωνα με τα μαθητικά    0 < α mod β <=  β  για θετικούς β
Στο pseudoglossa.gr
-9 mod 2 = -1

Αν και δεν είναι μέσα στην ύλη μήπως θα ήταν καλύτερα να αλλάξει η υλοποίηση και να συμφωνεί με τον μαθηματικό ορισμό;

sstergou

Και ποιος είναι ο μαθηματικός ορισμός;
Εδώ πάντως τα πράγματα δεν είναι καθόλου ξεκάθαρα.

apanagio

Στη wikipedia που κάνεις link λέει:
Παράθεση
In mathematics the result of the modulo operation is the remainder of the Euclidean division.

Και η ευκλείδεια διαίρεση ορίζεται:
Παράθεση
Given two integers a and b, with b ≠ 0, there exist unique integers q and r such that a = bq + r and 0 ≤ r < |b|

Διάφορες γλώσσες προγραμματισμού έχουν και διαφορετική προσέγγιση.

sstergou

Δηλαδή αν κατάλαβα καλά λες ότι πρέπει να επιστρέφει πάντα θετικό;

Υπάρχει κάποιος λόγος πέραν του μαθηματικού ορισμού όπου αυτό πρέπει να συμβαίνει;

apanagio

Ναι αυτό λέω.

Εκεί που μου προέκυψε το πρόβλημα ήταν όταν σε μια άσκηση ένα παιδί ήθελε να δει αν ένας αριθμός είναι άρτιος ή περιττός. Κάνοντας έλεγχο με
x mod 2 = 1
δεν του δούλευε για αρνητικούς.


sstergou

#5
Πάντως το έχει στα common pitfalls! http://en.wikipedia.org/wiki/Modulo_operation#Common_pitfalls

Από την άλλη το 9 mod 2 έχει μια λογική να είναι διαφορετικό από το -9 mod 2.

Δεν ξέρω, αν το θέλουν και άλλοι να το αλλάξω.


apanagio

Ναι το ξέρω,
Το συναντησα πρώτη φορά στην άσκηση του βιβλίου (και του algo.pk)
"να διαβάζει έναν ακέραιο και να επιστρέφει τον επόμενο άρτιο"

Κανένας

Παράθεση από: sstergou στις 08 Δεκ 2014, 02:45:27 ΜΜ
Και ποιος είναι ο μαθηματικός ορισμός;
Εδώ πάντως τα πράγματα δεν είναι καθόλου ξεκάθαρα.

Εὐκλείδεια διαίρεση:
Γιὰ κάθε Ϲεῦγος ἀκεραίων (a, b) μὲ b > 0 ὑπάρχει ἕνα μοναδικὸ Ϲεῦγος ἀκεραίων (q, r), τέτοιο ὥστε
a = bq + r καὶ 0 ≤ r < b .
Στὴ σχέση αὐτὴ ὁ a χαρακτηρίζεται διαιρετέος καὶ ὁ b διαιρέτης. ῾Ο q ὀνομάζεται
(ἀκέραιο) πηλίκο τῆς διαίρεσης τοῦ a διὰ b καὶ ὁ r ὑπόλοιπο τῆς διαίρεσης.

Δηλαδή ακέραιο πηλίκο q ορίζουμε τον μεγαλύτερο ακέραιο για τον οποίο ισχύει bq<=a.
π.χ.   όπως (9 div 2=4 και 9 mod 2=1) διότι 4*2<9
    και όχι (9 div 2=5 και 9 mod 2=-1) διότι 5*2>9

   έτσι και (-9 div 2=-5 και -9 mod 2=1) διότι (-5)*2<-9
    και όχι (-9 div 2=-4 και -9 mod 2=-1) διότι (-4)*2>-9
Νικηφόρος Μανδηλαράς
ΓΕΛ Νάξου "Μανώλης Γλέζος"
https://blogs.sch.gr/nobody/

gpapargi

Στάθη είχαμε πει πιο παλιά να ακολουθήσουμε τον ορισμό της ακέραιας διαίρεσης  του Ευκλείδη όπως αυτός περιγράφεται στο βιβλίο των μαθηματικών κατεύθυνσης της Β λυκείου. Να υπάρχει και συνέχεια μεταξύ των βιβλίων και ειδικά να είμαστε σύμφωνοι με τα μαθηματικά που κάνουν τα παιδιά (έστω και με τα εκτός ύλης κομμάτια).
Γιώργος Παπαργύρης

sstergou

Αφού υπάρχει συμφωνία θα το αλλάξω.

gpapargi

Από ότι θυμάμαι είχε συζητηθεί στο πλαίσιο των ασαφειών της ΑΕΠΠ. Προβλημάτιζε και τον Άλκη το τι θα υλοποιήσει στο Διερμηνευτή.
https://alkisg.mysch.gr/steki/index.php?topic=914.0
Γιώργος Παπαργύρης

Κανένας

Παράθεση από: gpapargi στις 09 Δεκ 2014, 11:24:56 ΠΜ
Στάθη είχαμε πει πιο παλιά να ακολουθήσουμε τον ορισμό της ακέραιας διαίρεσης  του Ευκλείδη όπως αυτός περιγράφεται στο βιβλίο των μαθηματικών κατεύθυνσης της Β λυκείου. Να υπάρχει και συνέχεια μεταξύ των βιβλίων και ειδικά να είμαστε σύμφωνοι με τα μαθηματικά που κάνουν τα παιδιά (έστω και με τα εκτός ύλης κομμάτια).

Το θεώρημα της ακεραίας διαίρεσης  του Ευκλείδη στο βιβλίο των μαθηματικών κατεύθυνσης της Β λυκείου διατυπώνεται ως εξής:
Αν α και β ακέραιοι με β≠0 , τότε υπάρχουν μοναδικοί ακέραιοι κ και υ, τέτοιοι, ώστε
α=κβ+υ, 0≤υ<|β|.
και είναι ισοδύναμο με το παρακάτω:

Γιὰ κάθε Ϲεῦγος ἀκεραίων (a, b) μὲ b > 0 ὑπάρχει ἕνα μοναδικὸ Ϲεῦγος ἀκεραίων (q, r), τέτοιο ὥστε
a = bq + r καὶ 0 ≤ r < b .

στο οποίο απαιτείται ο διαιρέτης b να είναι θετικός ακέραιος (φυσικός)
δεδομένου ότι a/-b=-a/b και -a/-b=a/b.

Ο τελεστής mod όπου εφαρμόζεται πάντως πρέπει να επιστρέφει μη αρνητικό αποτέλεσμα.
Νικηφόρος Μανδηλαράς
ΓΕΛ Νάξου "Μανώλης Γλέζος"
https://blogs.sch.gr/nobody/

sstergou

Ωραία, το άλλαξα. Τώρα δουλεύει ως εξής:
function(a:Number, b:Number):Number {
	var r:Number = a % b;
	return r >= 0 ? r : r + Math.abs(b);
}

apanagio

Θα πρέπει να αλλάξεις και το div για να συμφωνεί.  :)


sstergou

Διαφώτισέ με λίγο για να μην ψάχνομαι, το παρακάτω εμφανίζει σε όλα Αληθής.
αλγοριθμος ταδε
για α από -10 μέχρι 10
	για β από 1 μέχρι 3
		πηλικο ← α div β
		υπολοιπο ← α mod β
		απ ← πηλικο * β + υπολοιπο
		γραψε α, β, απ, απ = α
	Τέλος_επανάληψης
τελος_επαναληψης
τελος ταδε

apanagio

Εγώ ακόμα δεν βλέπω την καινουρια έκδοση,
ίσως είναι cached στον browser μου η παλια.
αλλά αυτό που πρέπει να συμβαίνει είναι

έστω α = π*β + υ
όπου π = α div β και
υ = α mod β

πρέπει π*β <= α.
πχ -1 div 2 = -1
προς το παρόν -1 div 2 βγάζει 0

sstergou

Μήπως μπαίνεις στο pseudoglossa.gr και όχι στο pseudoglossa.gr/new ?
Σε λίγο καιρό η νέα έκδοση θα γίνει η βασική και η παλιά θα καταργηθεί.

sstergou


ether

Υπάρχει κάποιο πρόβλημα με την τιμή που επιστρέφεται για το div στην περίπτωση που ο διαιρέτης είναι αρνητικός

sstergou

Όλα αυτά που συζητάμε είναι μόνο για την περίπτωση που ο διαιρέτης είναι θετικός.
Δεν μου έρχεται στο μυαλό το τι θα μπορούσε να γίνει αν είναι αρνητικός.

Αν έχεις να προτείνεις κάτι μαζί με μια πηγή και αντίστοιχη φόρμουλα το βλέπουμε.

ether

Δες στο βιβλίο Μαθηματικά Θετικής Β' Λυκείου, σελίδες 142-143
http://ebooks.edu.gr/courses/DSGL-B100/document/4c5fc6fdnxxi/4c5fc737mw02/4e293c5aytvd.pdf

sstergou

Ωραία, θα το κοιτάξω όταν βρω χρόνο. Αν κάποιος έχει τη λύση ας μου την πει να μην κουράζομαι... :)

gpapargi

Θυμάμαι ότι πιο παλιά είχα γράψει όλους τους συνδυασμούς. Νομίζω ότι είναι στο παρακάτω link. Θα το δω και αύριο που θα δουλεύει το κεφάλι καλύτερα.
https://alkisg.mysch.gr/steki/index.php?topic=183.msg1170#msg1170
Γιώργος Παπαργύρης

sstergou

Πάντως έχεις μνήμη!
Στο θέμα που παραθέτεις υπάρχει link από όταν στο στέκι ήταν στο tripod το 2003 (και εγώ δεν είχα πάει ακόμα φαντάρος)!!!

gpapargi

Μπααα, δεν έχω μνήμη. Απλά θυμόμουν ότι κάποτε τα είχα γράψει και ότι ο Άλκης συγκεντρώνοντας τις ασάφειες είχε μαζέψει αρκετές (αν όχι όλες) τις σχετικές συζητήσεις για κάθε ασάφεια. Οπότε μπήκα στις ασάφειες (που είναι μόνιμο θέμα και εμφανίζεται πάνω πάνω) για τα div-mod και έριξα μια γρήγορη ματιά για το που είχα γράψει κάτι
Υπήρχε index δηλαδή και έγινε γρήγορα η αναζήτηση  :)
Γιώργος Παπαργύρης

sstergou