# 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

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

``````        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 = {}
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

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
for x=2,math.sqrt(number) do
if number%x==0 then
break
end
end
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

``````-- 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

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

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

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)
ellipse(WIDTH/2 + x * Zoom, HEIGHT/2 + r * Zoom, 5)
strokeWidth(2)
local s = g:gsub("x", x-1)
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.