Vrijdag de 13de

Moderators: dirkwb, Xilvo

Reageer
Berichten: 11

Vrijdag de 13de

Hallo,
 
Hoe bereken ik, hoe vaak het voorkomt dat vrijdag de dertiende in 1 jaar, zowel in februari als in maart voorkomt?
Je weet sowieso dan de volgende dingen:
- Het is geen schrikkeljaar
- Februari begint dan op een zondag
 
Alvast bedankt,
Maarten 

Gebruikersavatar
Berichten: 10.179

Re: Vrijdag de 13de

Wat je ook nog weet is dat je jaar dan op een donderdag begint. Dus de echte vraag is: hoeveel jaren starten er op een donderdag? Deze vraag is uiteraard wat vaag gedefinieerd (wat is het begin en het einde van de periode waarin je kijkt?), maar ik heb wat gezocht hierop en het is geen eenvoudige vraag. Hier alvast wat leesvoer: http://mathforum.org/library/drmath/view/52351.html
Zoek je graag naar het meest interessante wetenschapsnieuws? Wij zoeken nog een vrijwilliger voor ons nieuwspostteam.

Gebruikersavatar
Berichten: 6.058

Re: Vrijdag de 13de

Hoeveel jaren die geen schrikkeljaar zijn starten op een donderdag? ;)
That which can be asserted without evidence can be dismissed without evidence.

Gebruikersavatar
Berichten: 10.179

Re: Vrijdag de 13de

Hmm, ja, het is nog subtieler...
 

Opmerking moderator

Ik verplaats dit sowieso al naar het vakforum ;).
Zoek je graag naar het meest interessante wetenschapsnieuws? Wij zoeken nog een vrijwilliger voor ons nieuwspostteam.

Gebruikersavatar
Berichten: 4.320

Re: Vrijdag de 13de

Er kan inderdaad naar een tijdvak van 400jaar gekeken worden zoals in de link van Drieske staat.
 
Wat er niet duidelijk in staat dat is dat zo'n periode van vier eeuwen wel altijd met de zelfde dag moet beginnen.
Er blijken gelukkig precies 20871 weken te passen in zo'n periode van vier eeuwen heb ik gevonden.
 
Mij lijkt het het beste met een tabelletje te werken.
Ik zou nu zo starten:
begin met het 2001 (laat dit dan lopen tot en met 2400)
 
Kijk op welke dag 13 feb. in 2001 valt. (die kan dan wel of niet worden aangeturf)
Ga dan naar 2002 en bedenk dat de dag dan eentje verschuift. (weer wel of niet turven)
Ga dan naar 2003 en .................................
 
Ga dan naar 2004 maar dit is een schrikkeljaar dus valt zeker af.
 
Ga naar 2005 en bedenk dat de dag nu twee dagen is verschoven enz.
 
Is effe wat werk als er in de rijtjes geen regelmaat wordt ontdekt (die er wel is).
 
Vergeet niet dat 2100 , 2200 , 2300 geen schrikkeljaren zijn en 2400 wel.
In de wiskunde zijn er geen Koninklijke wegen Majesteit.

Berichten: 11

Re: Vrijdag de 13de

Kan het niet op een snellere manier ipv helemaal uitschrijven? Bijvoorbeeld door een formule op te stellen?

Gebruikersavatar
Berichten: 4.320

Re: Vrijdag de 13de

Dat uitschrijven valt best wel mee.
 
Kijk naar het eerste schrikkeljaar en op welke dag dat valt.
 
Bedenk nu dat bij 8 schrikkeljaren op rij er herhaling MOET zijn er zijn immers maar zeven dagen in een week.
 
Dus na maximaal 28 dagen moet de zelfde cyclus optreden.
Wat betekent dat je maar 28 dagen echt hoeft te turven.
 
Wel goed opletten dat bij de eeuw breuk in de cyclus is, maar na die breuk komt de cyclus weer terug.
 
Ik zou die dagen even uitprinten in kolommen (met duidelijk aan gegeven wat schrikkeljaren zijn) dat geeft overzicht en voorkomt vergissingen.
In de wiskunde zijn er geen Koninklijke wegen Majesteit.

Berichten: 11

Re: Vrijdag de 13de

In de link van drieske gaat een artikel over hoevaak een jaar start op zondag maar dat kan je natuurlijk gewoon ook doen voor donderdag en dan krijg je het antwoord als het goed is

Gebruikersavatar
Berichten: 4.320

Re: Vrijdag de 13de

Dat lijkt me niet.
 
Immers daar worden de donderdagen van de schrikkeljaren meegeteld, terwijl ze hier juist geskipt moeten worden.
 
PS.
Ook daar werken ze met een soort turf tabellen.
In de wiskunde zijn er geen Koninklijke wegen Majesteit.

Berichten: 264

Re: Vrijdag de 13de

Als je de onregelmatigheid van eeuwjaren die geen schrikkeljaar zijn buiten beschouwing laat, is de dagkalender om de 28 jaar (4*7) het gehele jaar hetzelfde, en voor die gehele periode van 28 jaar.
Dus in 1987 1959 1931 1903  en in de toekomst in 2043 2071 en 2099 vielen/vallen de dagen het gehele jaar hetzelfde als nu in 2015.
 
Maar binnen zo'n 28 jarige cyclus voldoet ook het jaar wat 11 jaar later en het jaar wat 22 jaar later is aan de voorwaarde.  (13 feb en 13 maart allebei op een vrijdag)
 
 
1903 1914 1925
1931 1942 1953
1959 1970 1981
1987 1998 2009
2015 2026 2037
2043 2054 2065
2071 2082 2093
2099
 
voldoen aan de voorwaarde in de periode 1900-2099
 
Het wordt echter ingewikkelder met eeuwjaren die geen schrikkeljaar zijn ertussen

Berichten: 264

Re: Vrijdag de 13de

Ik heb het nog even wat beter uitgezocht. (nagecheckt)
(omdat ik zelf op een schrikkeldag geboren ben)
 
Een jaar met vrijdag de dertiende zowel in februari als in maart.
komt 11 keer per eeuw voor
 
Dat is dus 44 keer in 400 jaar.
De opeenvolging van zulke jaren is (in een 400 jaar periode)
26 keer na 11 jaar
17 keer na  6 jaar
en 1 keer na 12 jaar  (na een van de eeuwwisselingen )
 
dat het 3 keer achter elkaar na 6 jaar voorkomt,  (rond eeuwwisselingen)
komt 2 keer voor in zo'n periode van 400 jaar  
 
;) .

Berichten: 264

Re: Vrijdag de 13de

Nog even een poging om het als een regel te formuleren.
 
Als het zo'n jaar-X is (vrijdag 13 zowel in feb. als mrt)
Zo als ook dit jaar (2015) is.
 
Dan is het volgende jaar-X:
- 6 jaar later als in die 6 jaar maar 1 schrikkeldag voorkomt.
- of 11 jaar later in andere gevallen,
tenzij (!) in die 11 jaar maar 2 schrikkeldagen voorkomen i.p.v. 
de gebruikelijke 3 schrikkeldagen.
In dat geval (wat maar eens in de 400 jaar voorkomt) zal het 12 jaar zijn 
en dat zal zijn rond de laatste van de drie opvolgende eeuwwisselingen 
die het schrikkeljaar overslaan. (rond 1900 2300 2700 etc.) 
 
Het vorige jaar-X was dan:
- 6 jaar eerder als in die 6 jaar maar 1 schrikkeldag voorkwam.
- 11 jaar eerder in andere gevallen.
tenzij er in die 11 jaar maar 2 schrikkeldagen voorkwamen i.p.v. 3.
In dat ene geval zal het 12 jaar eerder zijn geweest.

Gebruikersavatar
Moderator
Berichten: 4.094

Re: Vrijdag de 13de

Ik heb er een Python script van gemaakt. De dagen die geen schrikkeljaar zijn en op een donderdag beginnen zijn:
 
[2009, 2015, 2026, 2037, 2043, 2054, 2065, 2071, 2082, 2093, 2099, 2105, 2111, 2122, 2133, 2139, 2150, 2161, 2167, 2178, 2189, 2195, 2201, 2207, 2218, 2229, 2235, 2246, 2257, 2263, 2274, 2285, 2291, 2303, 2314, 2325, 2331, 2342, 2353, 2359, 2370, 2381, 2387, 2398]
 
Dit zijn 44 jaar, in 400 jaar tijd.
 
Python code:
Verborgen inhoud

Code: Selecteer alles

'''

Created on May 2, 2015

@author: physicalattraction
'''

class GregorianCalendar(object):

    def __init__(self):
        self.daynr2day = {0: 'Sun',
                          1: 'Mon',
                          2: 'Tue',
                          3: 'Wed',
                          4: 'Thu',
                          5: 'Fri',
                          6: 'Sat'}
        self.starting_day = {1600:6}  # 2000 started on a Saturday, so 1600 did as well.

    def is_leap_year(self, year):
        '''Returns whether a given year is a leap year.'''
        
        if (year % 4 == 0):
            if (year % 100 == 0):
                if (year % 400 == 0):
                    return True
                else:
                    return False
            else:
                return True
        else:
            return False
    
    def starting_day_of_year(self, year):
        '''Returns the starting day of the given year.'''
        
        assert year >= 1600, 'The Gregorian calendar was not in use in {0}'.format(year)
        
        # If this year has been calculated already, return the value.
        if year in self.starting_day:
            return self.starting_day[year]
        
        # If this year has not been calculated yet, we have to calculate it first.
        # In order to so, we need to know the starting day of the previous year
        # If this has not been calculated yet, we do that year first.
        # Note that this invocation works recursively if many years need to be calculated first.
        if (year - 1) not in self.starting_day:
            self.starting_day_of_year(year - 1)

        if self.is_leap_year(year - 1):
            nr_days = 366
        else:
            nr_days = 365
        self.starting_day[year] = (self.starting_day[year - 1] + nr_days) % 7
        
        return self.starting_day[year]
    
    def det_years_in_question(self):
        result = [y for y in range(2000, 2400) if self.starting_day_of_year(y) == 4 and not self.is_leap_year(y)]
        return result

if __name__ == '__main__':
    gc = GregorianCalendar()
    r = (gc.det_years_in_question())
    print (r)
    print (len(r))
Test code:

Code: Selecteer alles

'''
Created on May 2, 2015

@author: physicalattraction
'''

from unittest import main, TestCase
from unittest.mock import Mock
from SandboxContainer.GregorianCalendar import GregorianCalendar

class Test_fetch_as_array(TestCase):

    def test_is_leap_year(self):
        self.assertTrue(GregorianCalendar.is_leap_year(Mock(), 2000), '2000 shall be a leap year')
        self.assertFalse(GregorianCalendar.is_leap_year(Mock(), 2001), '2001 shall not be a leap year')
        self.assertFalse(GregorianCalendar.is_leap_year(Mock(), 2002), '2002 shall not be a leap year')
        self.assertFalse(GregorianCalendar.is_leap_year(Mock(), 2003), '2003 shall not be a leap year')
        self.assertTrue(GregorianCalendar.is_leap_year(Mock(), 2004), '2004 shall be a leap year')
        self.assertFalse(GregorianCalendar.is_leap_year(Mock(), 2005), '2005 shall not be a leap year')
        self.assertFalse(GregorianCalendar.is_leap_year(Mock(), 2100), '2100 shall not be a leap year')
        self.assertFalse(GregorianCalendar.is_leap_year(Mock(), 2200), '2200 shall not be a leap year')
        self.assertFalse(GregorianCalendar.is_leap_year(Mock(), 2300), '2300 shall not be a leap year')
        self.assertTrue(GregorianCalendar.is_leap_year(Mock(), 2400), '2400 shall be a leap year')
    
    def test_starting_day_of_year(self):
        sut = GregorianCalendar()
        sut.starting_day = {1600:6}
        self.assertEqual(sut.starting_day_of_year(1600), 6, '1600 shall start on a Saturday')
        self.assertEqual(sut.starting_day_of_year(2000), 6, '2000 shall start on a Saturday')
        self.assertEqual(sut.starting_day_of_year(2001), 1, '2001 shall start on a Monday')
        self.assertEqual(sut.starting_day_of_year(2002), 2, '2002 shall start on a Tuesday')
        self.assertEqual(sut.starting_day_of_year(2003), 3, '2003 shall start on a Wednesday')
        self.assertEqual(sut.starting_day_of_year(2004), 4, '2004 shall start on a Thursday')
        self.assertEqual(sut.starting_day_of_year(2005), 6, '2005 shall start on a Saturday')
        
if __name__ == "__main__":
    main()


 

Gebruikersavatar
Moderator
Berichten: 4.094

Re: Vrijdag de 13de

Leuk weetje trouwens. Ik heb het algoritme uitgebreid, om te bepalen hoe vaak vrijdag de dertiende voorkomt door naar de eerste dag van iedere maand te kijken. Dit is het resultaat:
 
{0: 688, 1: 684, 2: 687, 3: 685, 4: 685, 5: 687, 6: 684}

 
Dit betekent dat er op 400 jaar tijd 688 maanden op een zondag beginnen en dus een vrijdag de dertiende hebben. De kans dat een willekeurige maand een vrijdag de dertiende heeft is hiermee groter dan 1/7.
 
Verborgen inhoud

Code: Selecteer alles

class GregorianCalendar(object):
 
    # Rest of class same as above
 
    def starting_day_of_month(self, month):
        '''Returns the starting day of the given month.'''
        
        # If this month has been calculated already, return the value.
        if month in self.starting_day_per_month:
            return self.starting_day_per_month[month]
        
        if (month - 1) not in self.starting_day_per_month:
            self.starting_day_of_month(month - 1)

        m = ((month - 1) % 12) + 1
        if m in (1, 3, 5, 7, 8, 10, 12):
            nr_days = 31
        elif m in (4, 6, 9, 11):
            nr_days = 30
        elif m == 2:
            year = (int) (month / 12)
            if self.is_leap_year(year):
                nr_days = 29
            else:
                nr_days = 28
        else:
            raise(AssertionError('Month {0} not recognized'.format(month)))
        self.starting_day_per_month[month] = (self.starting_day_per_month[month - 1] + nr_days) % 7
        
        return self.starting_day_per_month[month]
    
    def det_friday_thirteenth(self, starting_day):
        result = [m for m in range(0, 400 * 12) if self.starting_day_of_month(m) == starting_day]
        return result

if __name__ == '__main__':
    gc = GregorianCalendar()
    
    nr_months_starting_with = dict()
    for day in range(7):
        nr_months_starting_with[day] = len(gc.det_friday_thirteenth(day))
    print (nr_months_starting_with)

Reageer