Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Discussion for math. algorithms

edited June 2 in General Posts: 774

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.

Comments

  • edited May 29 Posts: 774

    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

    :)

  • dave1707dave1707 Mod
    Posts: 6,828

    @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
    
  • Posts: 774

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

  • Posts: 774

    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
    
  • edited June 1 Posts: 774

    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 .. "\n"
                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
    
  • dave1707dave1707 Mod
    edited June 1 Posts: 6,828

    @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
    
  • Posts: 402

    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
    
  • dave1707dave1707 Mod
    Posts: 6,828

    @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
    
  • dave1707dave1707 Mod
    Posts: 6,828

    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
    
  • Posts: 774

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

    -- 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 ;)

    About primes:

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

  • Posts: 402

    @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.

  • Posts: 774

    @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!

  • Posts: 402

    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
    
  • dave1707dave1707 Mod
    edited June 2 Posts: 6,828

    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
  • Posts: 774

    @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

  • Posts: 774

    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
    
  • dave1707dave1707 Mod
    Posts: 6,828

    @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.

  • Posts: 402

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

  • Posts: 774

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

    @LoopSpace ok thanks.

  • dave1707dave1707 Mod
    Posts: 6,828

    @TokOut That’s all you can do to draw a graph, connect points. Since you can only plot a point at a full value (1, 2, 3, etc.) or at a half value (1.5, 2.5, 3.5, etc), you can only round to those values. But that doesn’t mean you can’t zoom in at a certain section of a graph which would allow you to plot in better detail as you zoom in.

  • Posts: 774

    @dave1707. I see. But e.g. is a function 3x^3 + 2x - 10 = y

    The only way to select intersects with y=0 is to find such x that equal 0 in this case. We can do it only with solving it as equations. This gives me the idea of creating a project to solve equations. But still, how would we do it?

  • dave1707dave1707 Mod
    edited June 4 Posts: 6,828

    @TokOut Here’s a graphing example for your equation above. Reducing the step value will give you a better resolution of where the graph crosses x=0. Move the xx and yy sliders to move the circle cursor to show the graph crosses at x=0 and y=-10. You can also change the X and Y zoom values. This isn’t perfect but just a quick example to show you how to get better resolutions for a graph.

    EDIT: Using the round cursor, you can see that when x=0, then y=-10. When y=0 then x=1.35 or close to it.

    function setup()
        parameter.number("step",.01,1,.3)
        parameter.integer("Xzoom",1,200,150)
        parameter.integer("Yzoom",1,200,25)
        parameter.number("xx",-3,3,0)
        parameter.number("yy",-15,1,0)
        print("move Output window down")
    end
    
    function draw()
        background(40, 40, 50)
        fill(255)
        translate(WIDTH/2,HEIGHT*.8)
        stroke(255)
        strokeWidth(1)
        line(-500,0,500,0)
        line(0,-1000,0,1000)
        for x=-50,50,step do
            y=3*x^3 + 2*x - 10
            point(x*Xzoom,y*Yzoom)
        end
        noFill()
        ellipse(xx*Xzoom,yy*Yzoom,20)
    end
    
  • Posts: 774

    Thanks @dave1707

  • Posts: 774
    function setup()
        -- math.maxinteger: 9223372036854775807
        num1 = BigInt("11")
        num2 = BigInt("-22")
    
        print(num1:get() .. " + " .. num2:get() .. " = " .. num1:add(num2):get())
    end
    
    BigInt = class()
    
    function BigInt:init(value)
        self.isNegative = false
    
        if string.sub(value, 1, 1) == "-" then
            value = string.sub(value, 2, #value)
            self.isNegative = true
        end
    
        self.value = value or "0"
    end
    
    function BigInt:get()
        local str = self.value
    
        if self.isNegative then
            str = "(-" .. str .. ")"
        end
    
        return str
    end
    
    function BigInt:add(num)
        local a = string.reverse(self.value)
        local b = string.reverse(num.value)
        local c = {}
        -- Overwrite "c" as "a"
        for x = 1, #a do
            local n = 1
            if a.isNegative then
                n = -1
            end
            table.insert(c, math.tointeger(string.sub(n*a, x, x)))
        end
        -- Add "b" to "c"
        for x = 1, #b do
            if c[x] then
                if b.isNegative then
                    c[x] = c[x] - math.tointeger(string.sub(b, x, x))
                else
                    c[x] = c[x] + math.tointeger(string.sub(b, x, x))
                end
            else
                if b.isNegative then
                    c[x] = - math.tointeger(string.sub(b, x, x))
                else
                    c[x] = math.tointeger(string.sub(b, x, x))
                end
            end
        end
        -- Fix to digits only
        local n = 0
        for a, b in ipairs(c) do
            b = b + n
            n = 0
            while b > 9 do
                b = b - 10
                n = 1
            end
            c[a] = b
        end
        -- Reverse Back
        local p = {}
        for a, b in ipairs(c) do
            table.insert(p, 1, b)
        end
        c = p
        -- Return string
        local str = ""
        for a, b in ipairs(c) do
            str = str .. b
        end
        local ret = BigInt(str)
        if a.isNegative then
            ret.isNegative = true
        end
    
        return ret
    end
    

    Hello, I need very large integers. I’ve created a class BigInt which can add numbers. How do I subtract? I’ve got a problem with my logic...

  • Posts: 65
    About the primes, iI don’t know if this helps, but instead of checking every second number you could check the number below and above of multiples of six, since every prime except 2,3 is either in the form of: 6x+1 or 6x-1
  • Posts: 774

    @GR00G0 Kind if, true, Yes, it can be proven with the following: 2, 3, 4 are not possible because either :2 or :3, and 6x-5 = 6(x-1)+1. Nice found!

  • dave1707dave1707 Mod
    Posts: 6,828

    @TokOut Here’s something I have to add or subtract large strings of numbers.

    function setup()
        v1="465357876532246799765422346888754334579976582"
        v2="855545689842234567908765434456898765333452167"
        add(v1,v2)
        sub(v1,v2)
    end
    
    function add(s1,s2)
        local s1p,s2p=s1,s2
        local s1=string.rep("0",math.max(#s1,#s2)-#s1)..s1
        local s2=string.rep("0",math.max(#s1,#s2)-#s2)..s2
        local s3=""
        local c,v=0,0
        for z=#s1,1,-1 do
            local v1=tonumber(string.sub(s1,z,z))
            local v2=tonumber(string.sub(s2,z,z))
            v=v1+v2+c
            c=0
            if v>9 then
                v=v-10
                c=1
            end
            s3=v..s3
        end
        if c>0 then
            s3="1"..s3
        end
        print(s1p.." + "..s2p.." = "..s3)
    end
    
    function sub(s1,s2)
        local s1p,s2p=s1,s2
        local s1=string.rep("0",math.max(#s1,#s2)-#s1)..s1
        local s2=string.rep("0",math.max(#s1,#s2)-#s2)..s2
        if s2>s1 then
            minus=true
        end
        local s3=""
        local c,v=0,0
        for z=#s1,1,-1 do
            local v1=tonumber(string.sub(s1,z,z))
            local v2=tonumber(string.sub(s2,z,z))
            if minus then
                v=v2-v1-c
            else
                v=v1-v2-c
            end
            if v<0 then
                v=v+10
                c=1
            end
            s3=v..s3
        end
        for z=1,#s3 do
            if string.sub(s3,z,z)~="0" then
                s3=string.sub(s3,z)
                break
            elseif z==#s3 then
                s3="0"
            end
        end
        if minus then
            print(s1p.." - "..s2p.." = -"..s3)
        else
            print(s1p.." - "..s2p.." = "..s3)
        end
    end
    
  • Posts: 402

    Tables of digits would be much better than strings for big integers. Here's a lua-only implementation that looks like it could be dropped into a Codea project: https://github.com/empyreuma/bigint.lua/blob/master/bigint.lua

  • dave1707dave1707 Mod
    Posts: 6,828

    @LoopSpace I agree that tables would be faster. I tried 2 20,000 digit strings and it did both the add and sub functions in 1 second. Maybe I’ll convert the above program to use tables and see what the increase is.

  • dave1707dave1707 Mod
    Posts: 6,828

    @LoopSpace I changed the code on my iPad to use tables instead of strings and it ran 13 times faster. The input is still a string that get converted to a table. The add and sub functions use tables. I’ll change the above code later.

  • Posts: 774

    Does anybody use goto?

  • dave1707dave1707 Mod
    edited June 13 Posts: 6,828

    I did, but I haven’t done so in a long time.

  • dave1707dave1707 Mod
    Posts: 6,828

    Here’s some code to multiple to strings of numbers. This is set up to multiply 2 1600 digit numbers.

    function setup()
        a="98765432109876543210987654321098765432109876543210"  -- string of 50 digits
        for z=1,5 do
            a=a..a  -- create string of 1600 digits
        end
        b=a
        str=mult(a,b)   -- multiply 2 1600 digit numbers
        print(str)
        print("size of a "..#a)
        print("size of b "..#b)
        print("size of a*b "..#str)
    end   
    
    function mult(str1,str2)
        local r,n1,n2={},{},{} 
        for z=1,#str1 do
            table.insert(n1,tonumber(string.sub(str1,z,z)))
            table.insert(r,0)
        end    
        for z=1,#str2 do
            table.insert(n2,tonumber(string.sub(str2,z,z)))
            table.insert(r,0)
        end
        for x=#n2,1,-1 do
            local carry=0
            for y=#n1,1,-1 do
                local v=r[x+y]+n2[x]*n1[y]+carry
                r[x+y]=v%10
                carry=math.floor(v/10)
            end
            r[x]=carry
        end
        if r[1]==0 then
            table.remove(r,1)
        end
        return(table.concat(r))
    end  
    
Sign In or Register to comment.