Kokonaispisteet kolmiossa

Anonyymi

Mainostetaanpa tätä ohjelmointihaastetta myös täällä matikka palstalla:

https://keskustelu.suomi24.fi/t/16695930/kokonaispisteet-kolmiossa

On kuitenkin sen verran matemaattinen tehtävä. Olen itse keksinyt kaksi tehokasta tapaa mutta en vielä postaa niitä. Olisi mukava nähdä paljon erilaisia lähestymistapoja. Ei tarvitse olla niin tehokkaitakaan.

21

67

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Harvinaisen typerästi muotoiltu alkuperäinen kysymys eikä tämä mainoskaan typeryydessä paljoaakaan jää jälkeen. Mitä kuvittelet tekeväsi? Kolmio? Kokonaispiste?

      • Anonyymi

        Aivan selkeähän tuo on. Jos hetken vaivaudut miettimään, niin tajuat kyllä miten ne kolmiot tähän liittyvät.


      • Anonyymi
        Anonyymi kirjoitti:

        Aivan selkeähän tuo on. Jos hetken vaivaudut miettimään, niin tajuat kyllä miten ne kolmiot tähän liittyvät.

        Taas selittelet. Kokonaisluvuilla laskeminen ei ole yleisessä tapauksessa helppoa. En tiedä millä luokalla olet ja minkä ohjelmointikielen alkeita yrität opetella.

        Jos a ja b ovat alle 1000, niin tietysti useimmiten löytyy jaksotus, jolla kombinaatiot saadat laskettua äärellisessä ajassa ihan tulojen summina isoillakin n:n arvoilla. Jos n on alkuluku, niin tulee vaikeuksia sovittaa jaksotusta.

        Tyypillinen typerä merkonomitason lasku, jossa rahaa on joitakin triljoonia euroja ja kahta erihintaista tuotetta pitää ostaa mahdollisimman monella eri tavalla ylittämättä budjettia. Ei tuohon löydy kuin yksi toimiva tapa laskea.


      • Anonyymi
        Anonyymi kirjoitti:

        Taas selittelet. Kokonaisluvuilla laskeminen ei ole yleisessä tapauksessa helppoa. En tiedä millä luokalla olet ja minkä ohjelmointikielen alkeita yrität opetella.

        Jos a ja b ovat alle 1000, niin tietysti useimmiten löytyy jaksotus, jolla kombinaatiot saadat laskettua äärellisessä ajassa ihan tulojen summina isoillakin n:n arvoilla. Jos n on alkuluku, niin tulee vaikeuksia sovittaa jaksotusta.

        Tyypillinen typerä merkonomitason lasku, jossa rahaa on joitakin triljoonia euroja ja kahta erihintaista tuotetta pitää ostaa mahdollisimman monella eri tavalla ylittämättä budjettia. Ei tuohon löydy kuin yksi toimiva tapa laskea.

        En sanonut, että tehtävä on helppo, vaan että tehtävänanto on aivan selkeä, ja että kolmiot kyllä liittyvät asiaan jos vaivaudut hetken miettimään.

        Ja kyllä tuohon löytyy erilaisia tapoja ratkaista se. Sekä suhteellisen tehokkaita, että hyvin tehottomia.

        Olennaisesti tehtävänä on laskea montako kokonaislukukoordinaateissa sijaitsevaa pistettä on pisteiden 0, n/a ja n/b rajaamaan kolmion sisällä tai reunoilla.


      • Anonyymi
        Anonyymi kirjoitti:

        En sanonut, että tehtävä on helppo, vaan että tehtävänanto on aivan selkeä, ja että kolmiot kyllä liittyvät asiaan jos vaivaudut hetken miettimään.

        Ja kyllä tuohon löytyy erilaisia tapoja ratkaista se. Sekä suhteellisen tehokkaita, että hyvin tehottomia.

        Olennaisesti tehtävänä on laskea montako kokonaislukukoordinaateissa sijaitsevaa pistettä on pisteiden 0, n/a ja n/b rajaamaan kolmion sisällä tai reunoilla.

        Korjaan: pisteiden (0,0), (n/a,0) ja (0,n/b).


      • Anonyymi
        Anonyymi kirjoitti:

        En sanonut, että tehtävä on helppo, vaan että tehtävänanto on aivan selkeä, ja että kolmiot kyllä liittyvät asiaan jos vaivaudut hetken miettimään.

        Ja kyllä tuohon löytyy erilaisia tapoja ratkaista se. Sekä suhteellisen tehokkaita, että hyvin tehottomia.

        Olennaisesti tehtävänä on laskea montako kokonaislukukoordinaateissa sijaitsevaa pistettä on pisteiden 0, n/a ja n/b rajaamaan kolmion sisällä tai reunoilla.

        Et osaa kirjoittaa etkä lukea suomen kieltä. Syytät taas muita osaamattomuudestasi.

        Ei laskussa ole mitään ongelmaa kenellekään vähääkään Pythonia osaavalle. Tehoton tapa ei ole edes teoriassa mahdollinen suurilla n:n arvoilla. Laskettava kahdessa osassa. Ensin suurin osa ihan kaavoilla ja sitten se pienen pieni pikkuriikkinen ei suoraan tasan mennyt "yläosa" ohjelmallisesti a ja b pituisilla silmukoilla. Kestää alle sekunnin, vaikka n olisi 10**1000. N. 30 riviä koodia.

        Kyse ei ole kolmiosta vaan viisikulmiosta. Eikä senkään nurkka ole origossa.

        Eikä tässä yhteydessä voi käyttää "kokonaispiste-" alkuisia termiä. Niissä kyse on ihan muista pisteistä. Katso sanairjasta "piste". Yritit ehkä muodostaa yhdyssanan, jota et osannutkaan kirjoittaa yhteen.


      • Anonyymi
        Anonyymi kirjoitti:

        Et osaa kirjoittaa etkä lukea suomen kieltä. Syytät taas muita osaamattomuudestasi.

        Ei laskussa ole mitään ongelmaa kenellekään vähääkään Pythonia osaavalle. Tehoton tapa ei ole edes teoriassa mahdollinen suurilla n:n arvoilla. Laskettava kahdessa osassa. Ensin suurin osa ihan kaavoilla ja sitten se pienen pieni pikkuriikkinen ei suoraan tasan mennyt "yläosa" ohjelmallisesti a ja b pituisilla silmukoilla. Kestää alle sekunnin, vaikka n olisi 10**1000. N. 30 riviä koodia.

        Kyse ei ole kolmiosta vaan viisikulmiosta. Eikä senkään nurkka ole origossa.

        Eikä tässä yhteydessä voi käyttää "kokonaispiste-" alkuisia termiä. Niissä kyse on ihan muista pisteistä. Katso sanairjasta "piste". Yritit ehkä muodostaa yhdyssanan, jota et osannutkaan kirjoittaa yhteen.

        Ilmeisesti sekoitit minut aloittajaan, joten korjataan nyt sekin: minä en ole kutsunut mitään kokonaispisteiksi. Joka tapauksessa, vaikka tuo termi on epätäsmällinen, asiayhteydestä on päivän selvää mitä sillä aloituksessa tarkoitettiin.

        En todellakaan ymmärrä mistä löydät tuohon kuvioon kaksi kulmaa lisää. Ihan esimerkkitapauksena, sovitaan, että a=b=1 ja n=2. Tällöin ne x;y-parit, jotka kelpaavat ratkaisuiksi, ovat 0;0, 0;1, 0;2, 1;0, 1;1 ja 2;0. Jos piirtelet ne koordinaatistoon, niin kuvio näyttää minusta enemmän kolmiolta kuin viisikulmiolta.

        PS: Osaan suomea, englantia, (välttävästi) ruotsia, pythonia, C#:ia, C :aa, javaa ja (ruosteisesti) Haskelia. En syytä ketään muuta niistä asioista, joita en osaa.


      • Anonyymi
        Anonyymi kirjoitti:

        Et osaa kirjoittaa etkä lukea suomen kieltä. Syytät taas muita osaamattomuudestasi.

        Ei laskussa ole mitään ongelmaa kenellekään vähääkään Pythonia osaavalle. Tehoton tapa ei ole edes teoriassa mahdollinen suurilla n:n arvoilla. Laskettava kahdessa osassa. Ensin suurin osa ihan kaavoilla ja sitten se pienen pieni pikkuriikkinen ei suoraan tasan mennyt "yläosa" ohjelmallisesti a ja b pituisilla silmukoilla. Kestää alle sekunnin, vaikka n olisi 10**1000. N. 30 riviä koodia.

        Kyse ei ole kolmiosta vaan viisikulmiosta. Eikä senkään nurkka ole origossa.

        Eikä tässä yhteydessä voi käyttää "kokonaispiste-" alkuisia termiä. Niissä kyse on ihan muista pisteistä. Katso sanairjasta "piste". Yritit ehkä muodostaa yhdyssanan, jota et osannutkaan kirjoittaa yhteen.

        Hei! Miten ne a ja b pituiset silmukat menee? Koodin voi laittaa pastebinniin: https://pastebin.pl/ kun näillä sivuilla se on hankala formatoida. Vastausten oli tarkoitus tulla tuonne ohjelmointipalstan puolelle mutta samapa tuo.


      • Anonyymi
        Anonyymi kirjoitti:

        Ilmeisesti sekoitit minut aloittajaan, joten korjataan nyt sekin: minä en ole kutsunut mitään kokonaispisteiksi. Joka tapauksessa, vaikka tuo termi on epätäsmällinen, asiayhteydestä on päivän selvää mitä sillä aloituksessa tarkoitettiin.

        En todellakaan ymmärrä mistä löydät tuohon kuvioon kaksi kulmaa lisää. Ihan esimerkkitapauksena, sovitaan, että a=b=1 ja n=2. Tällöin ne x;y-parit, jotka kelpaavat ratkaisuiksi, ovat 0;0, 0;1, 0;2, 1;0, 1;1 ja 2;0. Jos piirtelet ne koordinaatistoon, niin kuvio näyttää minusta enemmän kolmiolta kuin viisikulmiolta.

        PS: Osaan suomea, englantia, (välttävästi) ruotsia, pythonia, C#:ia, C :aa, javaa ja (ruosteisesti) Haskelia. En syytä ketään muuta niistä asioista, joita en osaa.

        Olet hyvä selittelemään. Jos joku huomauttaa sinulle virheistäsi, mikset voi uskoa heitä? Jos x, y>=1, niin sinulle kelpaavat ratkaisuiksi myös (0,0). Ja oikein selitysten kera neuvojaa haukkuen. Selitä miksi! Mitähän oikein yrität laskea?

        Monta muutakin asiaa on jäänyt sinulta huomaamatta ja ymmärtämättä jo tässäkin yhteydessä ja varmasti muualla miljoonittain.


      • Anonyymi
        Anonyymi kirjoitti:

        Olet hyvä selittelemään. Jos joku huomauttaa sinulle virheistäsi, mikset voi uskoa heitä? Jos x, y>=1, niin sinulle kelpaavat ratkaisuiksi myös (0,0). Ja oikein selitysten kera neuvojaa haukkuen. Selitä miksi! Mitähän oikein yrität laskea?

        Monta muutakin asiaa on jäänyt sinulta huomaamatta ja ymmärtämättä jo tässäkin yhteydessä ja varmasti muualla miljoonittain.

        Rauhoitu, ota vaikka kuppi glögiä ja hengitä.

        Näköjään tosiaan tein virheen tuossa alueen rajauksessa, koska olen tottunut aloittamaan indeksoinnin nollasta. Pahoittelut siitä. Se ei kuitenkaan olennaisesti muuta tehtävää mitenkään, koska ratkaisu haetaan täsmälleen samalla logiikalla, riippumatta siitä onko x:n ja y:n alaraja 0, 1, -1 vai 35. Joka tapauksessa tehtävä on selvittää, montako kokonaislukukoordinaateissa sijaitsevaa pistettä on kolmion sisällä tai reunoilla.

        Minulle ei ole koskaan ollut ongelma myöntää tekemiäni virheitä. Päin vastoin. Jos minä teen virheen, minä haluan kuulla siitä, että oppisin olemaan tekemättä samaa virhettä jatkossa. Jos siis olet minun kommenteissani huomannut jotain muuta korjattavaa, ole hyvä ja kerro mitä.


    • Anonyymi
    • Anonyymi

      Pienet luvut saa integroitua Pypyll%C3%A4. Yli 30 kertaa nopeampin kuin Python. %3Cbr %2F%3EJos kokeilee Python 2%3Alla%2C range on korvattava xrangella. Muuten muisti loppuu. %3Cbr %2F%3E%3Cbr %2F%3En %3D 1234567890123%2345%3Cbr %2F%3Ea %3D 883%3Cbr %2F%3Eb %3D 779%3Cbr %2F%3Ec %3D 0%3Cbr %2F%3Efor x in range%281%2Cn%2F%2Fa%2B1%29%3A c %2B%3D %28n-x%2Aa%29%2F%2Fb %3Cbr %2F%3Eprint%28c%29%3Cbr %2F%3E%3Cbr %2F%3E%3Cbr %2F%3EJa kaikki loput luvut saa laskettu jaksoittaisiin s%C3%A4%C3%A4nn%C3%B6llisiin funktioihin soveltuvalla paloittaisintegroinnilla. Riitt%C3%A4%C3%A4 laskea eka viistokattoinen torniosa. Muut aritmeettisella summakaavalla ja lopuksi lis%C3%A4t%C3%A4%C3%A4n vajaajaksoinen loppup%C3%A4tk%C3%A4.%3Cbr %2F%3E%3Cbr %2F%3En %3D 12345678901234%23567890123456789012345678901234567890123456789012345678901234567890%3Cbr %2F%3Eb %3D 779%3Cbr %2F%3Ea %3D 883%3Cbr %2F%3Eab %3D a%2Ab%3Cbr %2F%3Em %3D n - n%AB%3Cbr %2F%3Ep %3D m%2F%2Fab%3Cbr %2F%3Ec %3D 0%3Cbr %2F%3Efor x in range%281%2Cb%2B1%29%3A c %2B%3D %28n-x%2Aa%29%2F%2Fb %3Cbr %2F%3Ecc %3D p%2A%28c-%28p-1%29%2Aab%2Bc%29%2F%2F2 %3Cbr %2F%3Ec %3D 0%3Cbr %2F%3Efor x in range%28m%2F%2Fa%2B1%2Cn%2F%2Fa%2B1%29%3A c %2B%3D %28n-x%2Aa%29%2F%2Fb %3Cbr %2F%3Eprint%28c%29%3Cbr %2F%3Ecc %2B%3D c%3Cbr %2F%3Eprint%28cc%29%3Cbr %2F%3E%3Cbr %2F%3EEi sisennyksi%C3%A4. Toimi suoraan copy-pastella t%C3%A4%C3%A4lt%C3%A4. Laskee mit%C3%A4 vaan paljon alle sekunnissa. Kokeilkaa rajoja. Saa parantaa ihan vapaasti. Jos tied%C3%A4tte jonkun varman tuloksen isolla n%3An arvolla%2C testatkaa ja ilmoittakkaa mahdollisesta virheest%C3%A4. En ole jaksanut tarkistaa ihan kaikkia yli satanumeroisia lukua.

      • Anonyymi

        Talletus sotki yhden % merkin. Pitää olla:

        m = n - n"prosenttimerkki"ab


      • Anonyymi

        Jaksollisuuden ym s%C3%A4%C3%A4nn%C3%B6llisyydet voi todeta ja ymm%C3%A4rt%C3%A4%C3%A4 esim.%3A%3Cbr %2F%3E%3Cbr %2F%3En %3D 1234%3Cbr %2F%3Eb %3D 7%3Cbr %2F%3Ea %3D 8%3Cbr %2F%3Eab %3D a%2Ab%3Cbr %2F%3Em %3D n - n%AB%3Cbr %2F%3Ep %3D m%2F%2Fab%3Cbr %2F%3Ec %3D 0%3Cbr %2F%3Efor i in range%280%2Cp%29%3A %3Cbr %2F%3E__d %3D c%3Cbr %2F%3E__for x in range%28i%2Ab%2B1%2Cb%2Bi%2Ab%2B1%29%3A c %2B%3D %28n-x%2Aa%29%2F%2Fb %3Cbr %2F%3E__print c%2Cc-d%2C%28c-d%29%2F%2Fab%3Cbr %2F%3E%3Cbr %2F%3EToisen sarakkeen arvot pienenev%C3%A4t%2Fkasvavat a%2Ab portain. Niist%C3%A4 muodostuu ekan sarakkeen c-arvon lis%C3%A4ykset.


      • Anonyymi
        Anonyymi kirjoitti:

        Jaksollisuuden ym s%C3%A4%C3%A4nn%C3%B6llisyydet voi todeta ja ymm%C3%A4rt%C3%A4%C3%A4 esim.%3A%3Cbr %2F%3E%3Cbr %2F%3En %3D 1234%3Cbr %2F%3Eb %3D 7%3Cbr %2F%3Ea %3D 8%3Cbr %2F%3Eab %3D a%2Ab%3Cbr %2F%3Em %3D n - n%AB%3Cbr %2F%3Ep %3D m%2F%2Fab%3Cbr %2F%3Ec %3D 0%3Cbr %2F%3Efor i in range%280%2Cp%29%3A %3Cbr %2F%3E__d %3D c%3Cbr %2F%3E__for x in range%28i%2Ab%2B1%2Cb%2Bi%2Ab%2B1%29%3A c %2B%3D %28n-x%2Aa%29%2F%2Fb %3Cbr %2F%3E__print c%2Cc-d%2C%28c-d%29%2F%2Fab%3Cbr %2F%3E%3Cbr %2F%3EToisen sarakkeen arvot pienenev%C3%A4t%2Fkasvavat a%2Ab portain. Niist%C3%A4 muodostuu ekan sarakkeen c-arvon lis%C3%A4ykset.

        m = n - n % ab


    • Anonyymi

      Miten ja millä nimellä tätä ongelmaa on käsitelty matematiikan alkuaikoina? Kuinka monella tapaa voidaan ...?

      Löytyykö oeis.org:sta jotain taulukoita? Isoja lukuja on helppo laskea ja tulostaa, mutta miten niitä voi tarkistaa?

      • Anonyymi

        Ongelma on erikoistapaus seuraavasta: https://en.wikipedia.org/wiki/Integer_points_in_convex_polyhedra . Testasin ohjelmaasi ja samoja tuloksia saan myös omillani. Kyllähän se on oikein, jos usealle keskikokoiselle n:lle (jonka voi vielä brute forcellakin testata) tulee oikea tulos :D

        Wikipediassa mainittu Ehrhart-polynomi muuten liittyy minun toiseen algoritmiin. Tai siinä taitaa tulla se kvasi-tapaus, sillä kolmion kärjet eivät välttämättä ole kokonaislukupisteissä. Noh, minä selostan sitten sen "tapauskohtaisen polynomisuuden" jos nyt postaisin ne omat algoritmini tuonne alle.


    • Anonyymi
      • Anonyymi

        Ai niin ja memoisaatio tarvitaan myös, muuten ei tule nopea. Pienet tapaukset lasketaan brute force metodilla. Jos a ja b ovat hyvin suuria, niin ne "pienet" tapauksetkin saattavat vielä olla merkittävän kokoisia.


    • Anonyymi

      POLYNOMI ALGORITMI

      Ongelma voidaan ilmaista myös näin: Kuinka monta ei-negatiivista ratkaisua on yhtälöllä

      ax by z = n

      Tämä johtuu siitä, että uusi muuttuja z voi juosta 0:sta n:ään, joten ax by voi olla mitä tahansa n:stä 0:llaan. (Sallitaankin siis myös arvo nolla muuttujille; niiden ratkaisujen lukumäärä voidaan lopuksi vähentää). Muuttuja z siis hoitaa summauksen. Sitä taidetaan enkuksi kutsua slack-variable, joka muuttaa epäyhtälön yhtälöksi.

      Merkitään P0(n) yhtälön z=n epänegatiivisten ratkaisujen määrää (eli tietenkin vakio 1). Vastaavasti P1(n) olkoon yhtälön by z = n epäneg ratkaisujen määrä ja P2(n) yhtälön ax by z = n.
      P0 jo edellä "ratkaistiinkin". Ratkaistaan nyt P1. Se saadaan summana P0:n arvoista pisteissä n-by, kun y juoksee sallituissa rajoissa ja laskenta siten jakautuu b:hen eri tapaukseen riippuen siitä mitä n on modulo b. Jokainen näistä on lineaarinen polynomi n:n suhteen.
      Sitten P2:n ratkaisemisessa vastaavasti summataan P0:n arvoja ja jakaudutaan edelleen a:han eri tapaukseen riippuen n:n arvosta mod a.
      Kaiken kaikkiaan kuitenkin huomataan, että vastaus on jokin toisen asteen polynomi (riippuen siis n:stä modulo ab (tai oikeastaan lcm(a,b))). Noh, minä en viitsinyt lähteä laskeskelemaan sitä noilla summauksilla, vaan ratkaistaan se lagrangen interpolaatiopolynomina kun tiedetään arvo kolmessa pisteessä. Nämä kolme ja ne voi laskea vaikka brute forcella. Mutta koska arvojen täytyy olla samaa kuin n modulo ab (koska sama polynomi toimii vain samalle jäännösluokalle), niin taas jos a ja b ovat suuria, voi laskenta olla hidasta.

      Koodi (Sagea): https://pastebin.pl/view/90e18a1d

      • Anonyymi

        Ai niin: se nollan sisältävien ratkaisujen määrän vähäntäminen ei muuta sitä tosiasiaa, että ratkaisu on polynomi.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. SDP palauttaa Suomen kansalle kulta-ajat

      Hyvinvointivalto on pääosin SDP:n ja osin myös Maalaisliiton rakentama. Hyvinvointivaltion ylläpito edellyttää oikeude
      Maailman menoa
      162
      13814
    2. Aamun Riikka: työttömyydessä lähestytään viime laman synkintä vaihetta

      Nopeasti mentiiin upean Marinin hallituksen ennätystyöllisyydestä toiseen ääripäähän, kohti Suomen historian kurjimpia t
      Maailman menoa
      82
      9981
    3. Älkää vassarit kuvitelko, että Marinin kulta-ajat palaavat

      Vaikka demarit voittaisivat seuraavat vaalit, se ei palauta Marinin taskut-täyteen-kelasta-aikaa takaisin, ei voi eikä h
      Maailman menoa
      100
      9196
    4. Suomen velka kasvoi ennätysvauhtia - Mäkynen repostelee

      – Velka kasvoi eniten tilaston historiassa, Mäkynen kirjoittaa. – Vuoden 2025 toisella neljänneksellä selvästi eniten k
      Maailman menoa
      21
      8309
    5. Giorgia Meloni vs Riikka Purra

      Kyllä Italian pääministeri on kauniimpi ja seksikkäämpi, kuin Suomen valtiovarainministeri Riikka Purra. Mitä jotkut näk
      Maailman menoa
      47
      6823
    6. Persut JYTKYTTÄÄ ylös, ohi kepun! +2,1 %

      Persut palasi kolmen suurimman joukkoon ja on matkalla kohti kevään 2027 eduskuntavaalivoittoa. Sosialistit ovat syöksy
      Maailman menoa
      43
      6593
    7. 151
      6216
    8. Gallup, PS:lle JÄRISYTTÄVÄ nousu, SDP suurin laskija

      https://yle.fi/a/74-20186114 PS kovaa vauhtia nousemassa ennen 2027 vaaleja suurimmaksi puolueeksi. Nyt mennään jo etua
      Maailman menoa
      97
      5146
    9. Ohhoh. Kokoomusvirkamiehen mukaan Suomessa ei ole työttömyyskriisiä

      Kun kokoomuksen johtama hallitus epäonnistuu täydellisesti talouspolitiikassaan, niin aikaisemmin erittäin pahaksi määri
      Maailman menoa
      24
      3955
    10. En lähde armeijaan enkä siviilipalvelukseen

      Maanantaina telkan uutisissa toistamiseen kerrottiin tästä luuserista, joka kärsii muka "masennuksesta", mutta nauraa rä
      Maailman menoa
      405
      1349
    Aihe