Discussion for math. algorithms

And I found more than 1000 primes…

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, are primes.

Code:

function setup()
    parameter.boolean("Pause", false)
    parameter.action("Copy", copy)
    PrimesListed = {}
    Number = 2
    Order = 0
end

function draw()
    if not Pause then
        local isPrime = true
        for a = 1, math.ceil(Number/2) do -- We only need to prove galf of numbers
            if not ( a == Number or a == 1 ) then
                if Number/a == math.floor(Number/a) then
                    isPrime = false
                end
            end
        end
        -- Print primes
        if isPrime then
            local ending = "th"
            Order = Order + 1
            local Order = Order .. ""
            
            if string.sub(Order, #Order, #Order) == "1" then
                ending = "st"
            elseif string.sub(Order, #Order, #Order) == "2" then
                ending = "nd"
            elseif string.sub(Order, #Order, #Order) == "3" then
                ending = "rd"
            end
            -- print(string.sub(Order, #Order, #Order)) -- Fixed
            print(Number .. " is the " .. Order .. ending .. " prime number.")
            table.insert(PrimesListed, Number)
        end
        -- Update Numbers
        Number = Number + 1
    end
end

function copy()
    local str = ""
    for a, b in ipairs(PrimesListed) do
        str = str .. b .. ", "
    end
    str = str .. "are primes."
    pasteboard.copy(str)
end

The next prime number year is 2027

:slight_smile:

@TokOut Nice little program. You can speed it up a little. Instead of going half (Number/2), you only need to go to the square root of Number. Another thing to do is once Number is found not to be a prime, you should stop checking to see if it’s prime. You can eliminate if not (a==Number or a==1) by starting the for loop with 2 instead of 1 and since the for loop only goes to the square root of Number, a won’t be equal to Number. Then for Number/a == math.floor(Number/a) you can use Number%a==0 . Below shows the changes.

        for a = 2, math.sqrt(Number) do
            if Number%a==0 then
                isPrime = false
                break
            end
        end

Thank you for your reply @dave1707, however, I need to agree that I already have started reading some prime-finding discussions :smile:

What about the following edit?

        for a, b in ipairs(PrimesListed) do
            if Number%b == 0 then
                isPrime = false
                break
            elseif math.sqrt(Number) < b then
                break
            end
        end

So here’s the code: Because Codea can’t print large strings and displays nothing instead of them, I decided to saveText the primes instead of saveLocalData. Now in the first lines tab the text and click the edit line to see all the primes.

See the view in the files below

function setup()
    --[[
    readText("Tap here to see the texts.")
    ]]
    parameter.boolean("Pause", true)
    parameter.action("Save Current Primes Streak", save)
    parameter.action("Clear Saved Primes/ Start New", startNew)
    parameter.action("Copy To Pasteboard", copy)
    parameter.text("CheckPrime", "5")
    parameter.action("Check Prime", function() checkPrime(CheckPrime) end) -- lowercase is func, uppercase is string
    Number = 2
    Order = 0
    PrimesListed = {}
    loadData()
end

function draw()
    if not Pause then
        local isPrime = true
        --print(Number)
        --if not checkSimple(Number) then
        --[[for a = 1, math.ceil(math.sqrt(Number)) do -- We only need to prove half of numbers
            if not ( a == Number or a == 1 ) then
                if Number/a == math.floor(Number/a) then
                    isPrime = false
                end
            end
        end]]
        for a, b in ipairs(PrimesListed) do
            if Number%math.tointeger(b) == 0 then
                isPrime = false
                break
            elseif math.sqrt(Number) < math.tointeger(b) then
                break
            end
        end
        --end
        -- Print primes
        if isPrime then
            local ending = "th"
            Order = Order + 1
            local Order = Order .. ""
            
            if string.sub(Order, #Order, #Order) == "1" then
                ending = "st"
            elseif string.sub(Order, #Order, #Order) == "2" then
                ending = "nd"
            elseif string.sub(Order, #Order, #Order) == "3" then
                ending = "rd"
            end
            -- print(string.sub(Order, #Order, #Order)) -- Fixed
            print(Number .. " is the " .. Order .. ending .. " prime number.")
            table.insert(PrimesListed, Number)
        end
        
        -- Update Numbers
        Number = Number + 1
        if Number%2 == 0 then
            Number = Number + 1
        end
    end
end

function copy()
    local str = ""
    for a, b in ipairs(PrimesListed) do
        str = str .. b .. ", "
    end
    str = str .. "are primes."
    pasteboard.copy(str)
    print("Copied!")
end

function save()
    local str = ""
    for a, b in ipairs(PrimesListed) do
        str = str .. b .. " "
    end
    saveLocalData("p_list", str)
    saveText("Project:Primes", str)
    print("Saved!")
end

function loadData()
    local str = readLocalData("p_list")
    if str then
        local prntStr = ""
        local ord = 0
        for num in string.gmatch(str, "%d+") do
            ord = ord + 1
            prntStr = prntStr .. num .. " is a prime at position " .. ord .. "\
"
            Number = num -- Update till the last comes
            table.insert(PrimesListed, num)
        end
        Number = math.tointeger(Number) + 1
        Order = ord
        print(prntStr)
    end
end

function startNew()
    saveLocalData("p_list", nil)
end

--[[function checkSimple(Number)
    if Number == 4 then
        return false
    elseif Number > 5 then
        -- Filter 2- and 5-division (10-division)
        local n = Number .. ""
        local filterEnding = {"0", "2", "4", "5", "6", "8"}
        for a, b in ipairs(filterEnding) do
            if string.sub(n, #n, #n) == b then
                return false
            end
        end
        
        -- Filter 3-division
        local f = 0
        for a, b in string.gmatch(n, ".") do
            print(b)
            f = f + tointeger(b)
        end
        if f/3 == math.floor(f/3) then
            return false
        end
    end
    
    return true
end]]

function checkPrime(n)
    n = math.tointeger(n)
    local divisor
    if n > 1 then
        local isPrime = true
        for a = 1, math.ceil(math.sqrt(n)) do
            if not ( a == n or a == 1 ) then
                if n/a == math.floor(n/a) then
                    isPrime = false
                    if not divisor then
                        divisor = a
                    end
                end
            end
        end
        if isPrime then
            print("Check: " .. n .. " is a prime number.")
        else
            print("Check: " .. n .. " is not a prime number. It can be divided by " .. divisor .. ".")
        end
    else
        print("Check: The number should be greater than 1.")
    end
end

@TokOut Here’s something you can modify. It displays 200 primes starting at whatever value you enter. It took 16 seconds to calculate 200 primes starting at 1 trillion (1000000000000) on my iPad Air.

EDIT: Fixed an error that caused it to cancel.

function setup()  
    font("Courier")
    parameter.text("Start",2,calc)
    print("run in landscape mode")
end

function calc()
    prime={}
    number=tonumber(Start)
    if number==nil then
        return
    end
    tot=0
    while true do
        primeNumber=true
        for x=2,math.sqrt(number) do
            if number%x==0 then
                primeNumber=false
                break
            end        
        end 
        if primeNumber then
            table.insert(prime,number)
            tot=tot+1
            if tot>=200 then
                return
            end
        end
        number=number+1
    end
end

function draw()
    background(0)
    fill(255)
    text("200 prime numbers from  "..Start,WIDTH/2,HEIGHT-20)
    cnt=0
    for z=1,#prime,5 do
        cnt=cnt+1
        str=string.format("%10s  %10s  %10s  %10s  %10s",prime[z],prime[z+1],prime[z+2],prime[z+3],prime[z+4])
        text(str,WIDTH/2,HEIGHT-30-cnt*18)
    end
end

If we’re on the theme of searching for primes, here’s a graphical version of the Sieve of Eratosthenes.

-- Sieve

    displayMode(FULLSCREEN)
function setup()
    sf = 10
    local w,h = math.floor(WIDTH/sf),math.floor(HEIGHT/sf)
    size = w*h-1
    sieve = image(w,h)
    rt = initSieve(w,h,sieve)
end

function draw()
    background(40,40,50)
    spriteMode(CENTER)
    translate(WIDTH/2,HEIGHT/2)
    noSmooth()
    pushMatrix()
    scale(sf)
    sprite(sieve,0,0)
    popMatrix()
    if rt and rt() then
        rt = nil
        timeTaken = math.floor(ElapsedTime+.5) .. "s"
    end
    if timeTaken then
    fill(255, 255, 255, 178)
    fontSize(80)
        text(size,0,140)
        text("in",0,70)
    text(timeTaken,0,0)
    end
end

function initSieve(w,h,s)
    local n = w*h-1
    local a = 0
    local phi = (math.sqrt(5)-1)/2
    local coords = function(m)
        return m - math.floor(m/w)*w+1, h-math.floor(m/w)
    end
    return coroutine.wrap(
        function()
            local x,y,c,cl
            for k=2,n do
                x,y = coords(k)
                c = color(s:get(x,y))
                if c.a == 0 then
                    cl = colourRim(a)
                    a = a + phi
                    for l=2*k,n,k do
                        x,y = coords(l)
                        c = color(s:get(x,y))
                        if c.a ~= 0 then
                            c = c:mix(cl,.5)
                        else
                            c = cl
                        end
                        s:set(x,y,c)
                    end
                    coroutine.yield()
                end
            end
            return true
        end
    )
end

function colourRim(a)
    a = 6*(a - math.floor(a))
    local c = color(0)
    local b = a - math.floor(a)
    if a < 1 then
        c.r = 255
        c.g = b*255
    elseif a < 2 then
        c.r = (1-b)*255
        c.g = 255
    elseif a < 3 then
        c.g = 255
        c.b = b*255
    elseif a < 4 then
        c.b = 255
        c.g = (1-b)*255
    elseif a < 5 then
        c.b = 255
        c.r = b*255
    else
        c.b = (1-b)*255
        c.r = 255
    end
    return c
end

@LoopSpace Looks interesting. It looks like it starts in the upper left corner and goes to the right with non primes as a random color and primes as black. I wonder if changing the number of squares across will create a different pattern of primes. Here’s a link to a spiral prime program I wrote in October 2014. The blue square in the center is 1, 2 is to the right, 3 is above 2, and it spirals around the center. Each red circle is a prime number. See the link below for the code and full discussion.

https://codea.io/talk/discussion/5754/prime-numbers-in-a-spiral#latest

Here’s a version that shows primes as red rects. Upper left is 1 and it increments across then down. You can change the number of columns with the slider to see different patterns.

function setup() 
    print("run in landscape") 
    parameter.integer("col",1,74,74)
    prime={0}
    for z=2,5800 do
        prime[z]=1
        for x=2,math.sqrt(z) do
            if z%x==0 then
                prime[z]=0
                break
            end        
        end 
    end
end

function draw()
    background(0)
    cnt=0
    for y=1,100 do
        for x=1,col do
            cnt=cnt+1
            fill(255)
            if prime[cnt]==1 then
                fill(255,0,0)
            end
            rect(x*10,HEIGHT-y*10,9,9)
        end
    end
end

I’m renaming this to “mathematical algorithms”, because I’d like to discuss here instead of making a new topic :wink:

-- Fibonnaci sequence

function setup()
    Sequence = {1, 1}
    print("Started with " .. Sequence[1] .. " and " .. Sequence[2])
end

function draw()
    local num = Sequence[#Sequence-1] + Sequence[#Sequence]
    table.insert(Sequence, #Sequence + 1, num)
    print(num)
end

This little project will die out in seconds. That’s because it grows too fast. But you can stop it very easily :wink:

About primes:

@dave1707 didn’t checked out yet, but sounds amazing with the spirals. I’ll check now :slight_smile:

@dave1707 Close. The sieve method is based on the idea that rather than testing if a number N has divisors, we mark all multiples of lower numbers. That way, if a number N has not been marked it must be prime.

So on the grid we pick a colour to associate with 2 (it’s not a random choice, but it may as well be) then mark every multiple of 2 with that colour (except 2 itself).

We then move on to the next number, which is 3. This isn’t marked (as it isn’t a multiple of 2) so we pick the next colour and mark every multiple of 3 with that colour (except 3 itself). Numbers that were already marked with the 2 colour have their colours merged.

The next number is 4 which is already marked so we skip it moving on to 5.

In the end, the black squares are primes and the coloured squares are marked by their prime divisors.

The spiral project sounds like the Ulam spiral.

@TokOut with the Fibonacci sequence, don’t use print as that slows it down considerably. Also, that’s a great one to learn about coroutines.

@LoopSpace but that algorithm has a problem: We either create a table of numbers till n, and then do it, or we still have to mark upcoming numbers (which are infinite). May you show me with code, what you mean?

@dave1707 I checked out your prime spirals, amazing!

This is for ordinary lua rather than Codea, but it shows how to use coroutines to iterate through the Fibonacci numbers. Each time f() is called then it returns the next Fibonacci number. It doesn’t keep a record of the numbers so doesn’t eat up memory. In Codea, you could call this function each second and display the most recent numbers on the screen in a Star Wars scrolling style.

function createfib()
   local a,b = 0,1
   return coroutine.wrap(
      function()
	 while true do
	    a,b = b,a + b
	    if b == math.huge then
	       break
	    end
	    coroutine.yield(b)
	 end
	 return false
      end)
end

f = createfib()

while true do
   b = f()
   if b then
      print(b)
   else
      break
   end
end

Here’s some code to calculate a Fibonacci number. The first program I wrote only worked to about 16 or so digits before it gave wrong answers because of the limits of Codea math. This code uses strings so it doesn’t have that problem. Just enter the Fibonacci number you want to calculate in FibNbr then press Calc Fib. On my iPad Air, it took 9.49 seconds to calculate the 5,000th Fib Number. It had 1045 digits. It took 52.9 seconds for the 10,000th Fib Number with 2090 digits. If you turn on the prt slider, it will also print the Fib number when you do the calculation. You can use that if you want to copy the number to the pasteboard. Just tap the printed number to copy it. This should be run in landscape mode.

EDIT: Changed the code to add 1 to the Fibonacci number if you tap the screen near the top and subtract 1 if you tap the screen near the bottom.


function setup()  
    font("Courier")
    print("run in lanscape orientation")
    textMode(CORNER)
    f={"0","1","1"}
    v3=""
    dig=70
    parameter.text("FibNbr","100")
    parameter.action("Calc Fib",fib)
    parameter.boolean("prt",false)
    fib()
end

function draw()
    background(40, 40, 50)
    fill(255)
    text(string.format("Fibonacci number  %6d",fibnbr),10,HEIGHT-20)
    text(string.format("Number of digits  %6d",#v3),10,HEIGHT-40)
    text(string.format("Seconds to calc   %9.2f",en-st),10,HEIGHT-60)
    g=#v3//dig
    for d=0,g do
        text(string.sub(v3,(dig*d+1),dig*d+dig),10,HEIGHT-d*20-100)
    end
end

function fib()
    st=os.clock()
    fibnbr=(tonumber(FibNbr) or 0)//1
    if fibnbr<3 then
        v3=f[fibnbr+1]
        en=os.clock()
        return
    end
    v1="1"
    v2="1"
    cnt=2
    for m=3,fibnbr do
        v3=""
        c=0
        s=math.max(#v1,#v2)
        for z=1,s do
            v11=tonumber(string.sub(v1,z,z)) or 0
            v22=tonumber(string.sub(v2,z,z)) or 0  
            v=v11+v22+c
            if v>9 then
                c=1
                v3=v3..tonumber(v-10)
            else
                v3=v3..tonumber(v)
                c=0
            end
        end
        if c>0 then
            v3=v3..c
        end
        v1=v2
        v2=v3
        v3=string.reverse(v3)
        cnt=cnt+1
    end
    en=os.clock()
    if prt then
        output.clear()
        print(v3)
    end
end

function touched(t)
    if t.state==BEGAN then
        if t.y>HEIGHT/2 then
            FibNbr=FibNbr+1
        else
            FibNbr=FibNbr-1
            if FibNbr<0 then
                FibNbr=0
            end
        end
        fib()
    end
end

@dave1707 strangely it didn’t work for me.

@LoopSpace I googled coroutines, and before I read something wrong, is the following link what your talking about? https://www.lua.org/pil/9.1.html

Also, how shall we draw graphs? Simply inserting for every x a point in f(x) or can we do that simpler, so asymptotes/ roots etc. can be found? Because if there is a root at y=0 and x=sqrt(2) which is non integer, it won’t be found.

-- Graphs

function setup()
    g = "(1+1/x)^x"
    parameter.text("Graph", g)
    parameter.integer("Zoom", 1, 100, 10)
    parameter.action("Submit", function() g = Graph:gsub("sqrt", "math.sqrt") end)
end

function draw()
    background(50)
    resetStyle()
    strokeWidth(3)
    line(0, HEIGHT/2, WIDTH, HEIGHT/2)
    line(WIDTH/2, 0, WIDTH/2, HEIGHT)
    
    resetStyle()
    fill(255, 150, 255)
    stroke(255, 200)
    for x = math.floor(-WIDTH/2/Zoom), math.ceil(WIDTH/2/Zoom) do
        strokeWidth(0)
        local s = g:gsub("x", x)
        loadstring("r = " .. s)()
        ellipse(WIDTH/2 + x * Zoom, HEIGHT/2 + r * Zoom, 5)
        strokeWidth(2)
        local s = g:gsub("x", x-1)
        loadstring("z = " .. s)()
        line(WIDTH/2 + (x-1) * Zoom, HEIGHT/2 + z * Zoom, WIDTH/2 + x * Zoom, HEIGHT/2 + r * Zoom)
    end
    
    resetStyle()
    fill(255)
    for n = 1, math.floor(WIDTH/Zoom) do
        local size = Zoom/10
        ellipse(WIDTH/2, HEIGHT/2+n*Zoom, size)
        ellipse(WIDTH/2, HEIGHT/2-n*Zoom, size)
        ellipse(WIDTH/2+n*Zoom, HEIGHT/2, size)
        ellipse(WIDTH/2-n*Zoom, HEIGHT/2, size)
    end
end

@TokOut I loaded my latest code on my iPad 1. I had to change the integer divide ( // ) to math.floor. After that it ran fine. What did you run into that it didn’t work for you.

@TokOut Yes, that’s what I mean by coroutines.

@dave1707 Everything was fine, but how do we draw like real graphs? I mean all I did was connecting points…

@LoopSpace ok thanks.