rekenen, worteltrekken

Alles wat niet past in bovenstaande onderwerpen
Berichten: 10
Geregistreerd: 12 Nov 2016, 15:27

rekenen, worteltrekken

Berichtdoor pierrepasmans » 31 Jan 2017, 22:49

Ik probeer met de arduino te rekenen, en dat lukt redelijk. ik zoek echter een voorbeeld van een programmatje om te worteltrekken.
ik denk dat ik #include <math.h> moet gebruiken, en dat het gaat over sqrt.

mijn einddoel is om zelf een schets te schrijven waarmee ik priemgetallen kan zoeken.

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: rekenen, worteltrekken

Berichtdoor nicoverduin » 01 Feb 2017, 00:03

pierrepasmans schreef:Ik probeer met de arduino te rekenen, en dat lukt redelijk. ik zoek echter een voorbeeld van een programmatje om te worteltrekken.
ik denk dat ik #include <math.h> moet gebruiken, en dat het gaat over sqrt.

mijn einddoel is om zelf een schets te schrijven waarmee ik priemgetallen kan zoeken.

Wat houd je tegen om het gewoon te proberen?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: rekenen, worteltrekken

Berichtdoor Koepel » 01 Feb 2017, 02:10

Er zijn (te) veel algoritmes voor priemgetallen. De ene nog meer geoptimaliseerd dan de andere. Probeer er maar eentje, en kijk of het werkt.

Tegenwoordig heeft de Arduino omgeving bijna alles al geinclude, dus die #include <math.h> heb je misschien niet nodig.

De tweede sketch heeft hier ook worteltrekken als optimalisatie: http://www.gammon.com.au/forum/?id=12168&page=999

Afbeelding

Berichten: 10
Geregistreerd: 12 Nov 2016, 15:27

Re: rekenen, worteltrekken

Berichtdoor pierrepasmans » 01 Feb 2017, 16:55

beste Nico, ik ga zeker gewoon proberen, maar wist de syntax van het worteltrekken niet. bedankt voor de aanmoediging. Pierre

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: rekenen, worteltrekken

Berichtdoor shooter » 01 Feb 2017, 21:28

priemetallen zijn altijd hele getallen, je kunt dus wel een eind komen, maar als je een beetje verder komt dan zul je toch met een array of een string gebruiken.
denk eraan dat een rekenmachine ook maar een bepaalde precisie heeft.
je zult bijvoorbeeld een array van 100 cijfers nodig hebben.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: rekenen, worteltrekken

Berichtdoor Koepel » 01 Feb 2017, 22:12

Dit is de bovenste sketch met gewone getallen (zonder de leds) van die link naar Nick Gammon.
Hij heeft daar ook een sketch staan met BigNum.
Dit is dus met 32-bit long. Ik dacht dat zelfs de Arduino Uno 64-bits integers aan kan.

Code: Alles selecteren
// Find prime numbers.
// Taken from the first sketch at this page:
//    http://www.gammon.com.au/forum/?id=12168&page=999
// Removed the led outputs.
// With Arduino 1.8.1 and Arduino Uno and Arduino M0
//
// Set baudrate of serial monitor to 115200 !


// The SerialUSB is the serial port via the usb communication of a Arduino M0, Leonardo, Yun, and so on.
#define SERIAL Serial
// #define SERIAL SerialUSB

// A 'long' is signed 4 bytes for Arduino Uno and Arduino Zero and Arduino M0.
long candidate;
long found = 5; // Number we found
unsigned long start;

void setup()
{
  SERIAL.begin(115200);

  while (!SERIAL);   // for ATmega32U4 (Leonardo/Micro)

  SERIAL.println();
  SERIAL.println("Prime numbers  (starts at 11)");
}

void loop()
{
  for (candidate = 3; candidate < 99999999; candidate += 2)
  {
    showIfPrime (candidate);
  }
}

void showIfPrime (long num)
{
  // we are already skipping odd numbers, now skip if divisible by 3
  if (num % 3 == 0)
    return;

  // Only have to check for divisible for the sqrt(number)
  long upper = sqrt(num) + 6;

  // Check if the number is divisible (start at 6 going up)
  for (long cnum = 6; cnum <= upper; cnum += 6)
  {
    if (num % (cnum - 1) == 0)
      return;
    if (num % (cnum + 1) == 0)
      return;
  }  // end of checking cnum-1, cnum+1


  SERIAL.print(candidate);
  SERIAL.print(" is prime, took ");
  SERIAL.print(millis () - start);
  SERIAL.print (" ms, found ");
  SERIAL.print (found);
  SERIAL.println (" primes");
  start = millis ();

  found++;
}


Op dit moment heb ik een Arduino Uno en een Arduino M0 aan mijn computer hangen met elk een serial monitor. De Arduino M0 met 48 MHz heeft een drie keer snellere cpu klok, maar hij loopt meer dan drie keer sneller omdat de sketch met 32-bit long werkt en de ARM M0+ 32-bit is.
Mijn Arduino Uno zegt dat 1613609 een priemgetal is en mijn Arduino M0 zegt dat 6651661 een priemgetal is.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: rekenen, worteltrekken

Berichtdoor shooter » 02 Feb 2017, 23:14

er kan verschil zijn in de getallen, zeker als ze erg hoog worden door het aantal bits in accumulator
paul deelen
shooter@home.nl

Terug naar Theekransje

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten