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

63

    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. Poliisi: Kymmenhenkinen pohjalaisperhe ollut vuoden kateissa kansainvälinen etsintäkuulutus Poliis

      Poliisi: Kymmenhenkinen pohjalaisperhe ollut vuoden kateissa – kansainvälinen etsintäkuulutus Poliisi pyytää yleisön apu
      Maailman menoa
      467
      4054
    2. Tässä totuus jälleensyntymisestä - voit yllättyä

      Jumalasta syntyminen Raamatussa ei tässä Joh. 3:3. ole alkukielen mukaan ollenkaan sanaa uudestisyntyminen, vaan pelkä
      Jälleensyntyminen
      318
      1692
    3. Mitään järkeä?

      Että ollaan erillään? Kummankin pää on kovilla.
      Ikävä
      116
      1526
    4. En kadu sitä, että kohtasin hänet

      mutta kadun sitä, että aloin kirjoittamaan tänne palstalle. Jollain tasolla se saa vain asiat enemmän solmuun ja tekee n
      Ikävä
      89
      1474
    5. Noniin rakas

      Annetaanko pikkuhiljaa jo olla, niin ehkä säilyy vienot hymyt kohdatessa. En edelleenkään halua sulle tai kenellekään mi
      Ikävä
      99
      1408
    6. Oisko mitenkään mahdollisesti ihan pikkuisen ikävä..

      ...edes ihan pikkuisen pikkuisen ikävä sulla mua??.. Että miettisit vaikka vähän missähän se nyt on ja oiskohan hauska n
      Ikävä
      60
      1375
    7. Lapuan sanomissa käy rytinä

      Pistivät sitten päätoimittajan pihalle
      Lapua
      52
      1316
    8. Helena Koivu : Ja kohta mennään taas

      Kohta kohtalon päivä lähestyy kuinka käy Helena Koivulle ? Kenen puolella olet? Jos vastauksesi on Helenan niin voisi
      Kotimaiset julkkisjuorut
      98
      1235
    9. Oot ihana

      Toivottavasti nähdään sattumalta jonain kesäpäivänä♥️🥺🫂
      Ikävä
      44
      1079
    10. Au pair -työ Thaimaassa herättää kiivasta keskustelua somessa: "4cm torakoita, huumeita, tauteja..."

      Au pairit -sarjan uusi kausi herättää keskustelua Suomi24 Keskustelupalvelussa. Mielipiteitä ladataan puolesta ja vastaa
      Tv-sarjat
      34
      1078
    Aihe