กริดตัวเลขจำนวนเฉพาะ
(susam.net)- กริดตัวเลขจำนวนเฉพาะ เป็นเครื่องมือที่แสดงให้เห็นรูปแบบและโครงสร้างของจำนวนเฉพาะในเชิงภาพ
- กริดนี้จัดเรียงตัวเลขในรูปแบบ 2 มิติ ทำให้มองเห็นได้ในทันทีว่าจำนวนเฉพาะกระจายตัวอย่างไร
- การวิเคราะห์รูปแบบช่วยให้ได้อินไซต์เกี่ยวกับความเป็นระเบียบหรือความสุ่มของจำนวนเฉพาะ
- ช่วยให้ผู้เรียนด้านการเขียนโปรแกรม/คณิตศาสตร์เข้าใจทฤษฎีจำนวนเฉพาะได้อย่างเป็นรูปธรรมมากขึ้น
- สามารถใช้เป็นเอกสารอ้างอิงสำหรับสำรวจการกระจายของจำนวนเฉพาะจากหลากหลายมุมมอง
ภาพรวมของกริดตัวเลขจำนวนเฉพาะ
- เครื่องมือนี้มีจุดประสงค์เพื่อจัดเรียงตัวเลขในรูปแบบกริด 2 มิติ แล้วแยกแยะด้วยภาพว่าแต่ละช่องเป็นจำนวนเฉพาะหรือไม่
- ผู้ใช้สามารถกำหนดช่วงของแต่ละแถวและคอลัมน์เพื่อสร้างกริดในขนาดและรูปทรงที่หลากหลายได้
- ภายในกริด จำนวนเฉพาะจะถูกแยกให้เห็นเด่นชัดด้วยสีหรือสัญลักษณ์ ทำให้ตรวจสอบได้ทันทีว่าจำนวนเฉพาะกระจายตัวอย่างไร
- ช่วยให้สำรวจรูปแบบต่าง ๆ เช่น การกระจายแบบมีระเบียบ เส้นทแยงมุม และคลัสเตอร์ ได้ง่ายขึ้น ซึ่งเป็นข้อมูลที่ช่วยเสริมสัญชาตญาณทางคณิตศาสตร์
- เครื่องมือนี้มอบแหล่งอ้างอิงที่นักพัฒนาและนักเรียนสามารถนำไปใช้ในงานอัลกอริทึมหรืองานสร้างภาพข้อมูลได้
คุณสมบัติและตัวอย่างการใช้งาน
- ตำแหน่งของตัวเลขแต่ละตัวสะท้อนผลการตรวจสอบอย่างรวดเร็วว่าเป็นจำนวนเฉพาะหรือไม่
- ประมวลผลตัวเลขจำนวนมากได้พร้อมกัน จึงสามารถสำรวจการกระจายของจำนวนเฉพาะในช่วงตัวเลขขนาดใหญ่ได้
- ปรับแต่งรูปทรงของกริดได้ง่าย เช่น สี่เหลี่ยมจัตุรัส สี่เหลี่ยมผืนผ้า เป็นต้น
- มีความสำคัญในฐานะสื่อการเรียนรู้และการวิเคราะห์สำหรับการศึกษาคณิตศาสตร์ การวิจัยอัลกอริทึม และการนำเสนอเชิงภาพ
- นำไปใช้ได้ทั้งในการสำรวจทางคณิตศาสตร์ โจทย์ท้าทายด้านการเขียนโปรแกรม หรือการสัมภาษณ์ในหลากหลายบริบท
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
สวัสดี! เมื่อคืนผมทำเครื่องมือแสดงภาพกริดจำนวนเฉพาะแบบง่าย ๆ นี้ขึ้นมาเล่น ๆ ได้แรงบันดาลใจจากโพสต์ "Show HN" นี้ ที่บังเอิญเจอเมื่อไม่กี่วันก่อน ใช้วิธีทดสอบจำนวนเฉพาะ Miller-Rabin และใช้จำนวนเฉพาะจาก OEIS sequence A014233 เป็นฐาน จึงตรวจได้แม้กระทั่ง 3317044064679887385961980 ว่าเป็นจำนวนเฉพาะหรือไม่ ดูตัวอย่างได้ที่ลิงก์นี้ วงกลมสามวงที่เห็นตรงนั้นหมายถึงจำนวนเฉพาะด้านล่างนี้: 3317044064679887385961783
3317044064679887385961801
3317044064679887385961813
หวังว่าทุกคนจะสนุกกับมันเหมือนกัน
ภาพสวยมาก! ถ้ามีฟีเจอร์บอกว่าจุดนั้นคือจำนวนเฉพาะอะไรเมื่อเอาเมาส์ไปชี้ก็น่าจะดี และก็สงสัยว่าถ้าเพิ่มจำนวนคอลัมน์ของแต่ละแถวขึ้นทีละ X (หรือให้ X เป็นจำนวนเฉพาะ) จะเห็นแพตเทิร์นใหม่ ๆ หรือเปล่า
ขอบคุณที่ทำขึ้นมา! สนุกมากกับการไล่เพิ่มจำนวนคอลัมน์เร็ว ๆ แล้วเห็นแพตเทิร์นที่ซ้ำกัน การเคลื่อนไหวแบบวังวนเล็ก ๆ หรือเส้นโค้งขนาดใหญ่ ตอนเด็กผมชอบความเป็นปริศนาเชิงตรรกะของคณิตศาสตร์มาก แต่พอช่วงปลายมัธยมและมหาวิทยาลัย คณิตศาสตร์เริ่มเป็นนามธรรมมากขึ้นจนรู้สึกเข้าถึงยาก ถ้ามีเครื่องมือแบบนี้ไว้ช่วยมองภาพ ผมน่าจะรู้สึกว่ามโนทัศน์ทางคณิตศาสตร์จับต้องได้มากขึ้น และยังคงสงสัยใคร่รู้ต่อความสัมพันธ์ที่ซ่อนอยู่หลังสูตรต่าง ๆ
ถ้ามีฟีเจอร์ให้เปลี่ยนฐานตัวเลขเป็น 16 หรือฐานอื่น ๆ ได้ก็น่าจะน่าสนใจมาก อยากรู้จริง ๆ ว่าแพตเทิร์นจะเปลี่ยนไปอย่างไร
เจ๋งมาก! เห็นสิ่งที่คุณทำแล้วผมก็ดำดิ่งไปกับการพยายามหาแพตเทิร์นด้วยตัวเองแบบจริงจังเลย :D แต่พอจัดเรียงคอลัมน์กับแถวได้อิสระ ความพยายามของผมก็ดูจะไม่มีความหมายเท่าไร :D
ขอแชร์วิธีแปลก ๆ วิธีหนึ่ง: มองจำนวนเต็มเป็นชุด pack ละ 100 ตัว ถ้าใน pack มีจำนวนเฉพาะก็ระบายสีดำ ถ้าไม่มีก็สีแดง pack แรกมีจำนวนเต็มติดกัน 100 ตัว pack ที่สองมีตัวเลขเว้นทีละ 2 ตัว pack ที่สามเว้นทีละ 3 ตัว ไปเรื่อย ๆ แต่ละ pack เริ่มต่อจากจุดที่ pack ก่อนหน้าจบ แถวที่ 1 มีหนึ่ง pack แถวที่ 2 มีสอง pack แถวที่ 3 มีสาม pack... เป็นแบบนี้ มีภาพอยู่ที่นี่ มันดูเหมือนอักษรภาพจากอีกจักรวาลหนึ่งเลย ยังไม่ค่อยเข้าใจว่าทำไมถึงออกมาแบบนี้ ถ้าจะเทียบกับการกระจายแบบสุ่ม ลองเปลี่ยนโค้ดเป็นแบบนี้ได้: if (isPrime(myNum)) return 1; เป็น if (Math.random()>0.99) return 1; แล้วมันต่างกันชัดเจนมาก ผมสงสัยจริง ๆ ว่าความสมมาตรและคุณสมบัติต่าง ๆ ของแพตเทิร์นที่อิงจำนวนเฉพาะพวกนี้มาจากไหน
คอมเมนต์นี้ อธิบายภาพนี้ไว้ได้ดี โดยแก่นแท้แล้วมันคือการแสดงภาพของ gcd(x,y) และแทบไม่เกี่ยวกับจำนวนเฉพาะเลย พอรู้ข้อนี้แล้วจะเข้าใจที่มาของหลายแพตเทิร์นได้ง่ายขึ้น ถึงอย่างนั้นมันก็ยังเป็นภาพที่น่าสนใจมาก
คำอธิบายนี้ต่างจากโค้ดที่ลิงก์ไว้นิดหน่อย ไม่ใช่ว่า pack ลำดับที่ N ถูกเติมด้วยจำนวนเต็มที่ห่างกันทีละ N แต่คือแต่ละ pack ในแถวที่ N จะมีจำนวนเต็มที่ห่างกันทีละ N แทน ตัวอย่างเช่น pack แรกของแถวที่สองคือ {101, 103, 105, ..., 299} และ pack ที่สองคือ {102, 104, 106, ..., 300} ถ้าเข้าใจหลักนี้แล้ว แพตเทิร์นจะถูกอธิบายได้ดีในคอมเมนต์นี้
ผมหลงประเด็นนี้ไปพอสมควร ตอนแรกคิดว่าน่าจะโยงไปหา Ulam spiral ได้ง่าย ๆ แต่โพรงกระต่ายฝั่งนี้พาไปถึง polynomial residues และ "Conjecture F" ลึกลับ(คำอธิบาย) ส่วน parallax primes มีคำอธิบายที่ละเอียดกว่าและมีความรู้พื้นหลังที่เกี่ยวข้องในลิงก์นี้ โดยเฉพาะการตีความเชิงเรขาคณิตในหน้านี้ ที่ให้ความรู้สึกลงตัวมาก
ผมลองเล่นกับมันด้วยวิธีนี้: ตัวอย่าง แล้วพบว่าถ้าทำซ้ำเฉพาะ pack คู่หรือ pack คี่ แพตเทิร์นจะลู่เข้าได้จริง ๆ น่าทึ่งมาก
อยากเสนอให้ลองวาด Ulam spiral ดูด้วย Ulam spiral wiki แล้วถ้านี่เป็นสถานะตั้งต้นของ Conway's Game of Life ก็ชวนสงสัยมากว่าจะเกิดแพตเทิร์นที่น่าสนใจไหม คิดว่าน่าจะ brute-force ลองกับกริดเริ่มต้นหลายขนาดเพื่อคัดเกมที่อยู่ได้นานเกินจำนวนสเต็ปหนึ่ง จากนั้นให้คนมาสังเกตด้วยตาเองก็ได้ ถ้ามีกริดหรือเกลียวเล็ก ๆ บางแบบของจำนวนเฉพาะที่ก่ออะไรพิเศษขึ้นมา HN อาจคึกคักเลยก็ได้
ไม่เหมือนกันเสียทีเดียว แต่ผมมีตัวสร้าง Ulam spiral ที่เคยทำไว้เมื่อสิบกว่าปีก่อน ลิงก์ อันนี้ไม่ได้ปักแค่จำนวนเฉพาะ แต่กำหนดขนาดจุดตามจำนวนตัวหารที่เป็นจำนวนคู่ของตัวเลขในแต่ละตำแหน่ง
ขอเชียร์ Ulam spiral อีกเสียง ตอนแรกผมงงว่าทำไมไม่เห็นแนวทแยง ผมคาดว่าจะเป็น Ulam spiral แบบดั้งเดิม
เครื่องมือ Ulam spiral อีกตัว
สัญชาตญาณของผมเกี่ยวกับจำนวนเฉพาะคือมันน่าจะหายากขึ้นเร็วมาก แต่จริง ๆ แล้วจำนวนเฉพาะมีเยอะมาก
จริง ๆ แล้วจำนวนเฉพาะหาเจอยากขึ้นเรื่อย ๆ ตัวอย่างเช่น ถ้าวาดจำนวนเฉพาะทั้งหมดไว้ในแถวเดียว ก็จะเห็นความต่างชัดเจน(ดูที่นี่) ในทฤษฎีจำนวนก็มีทฤษฎีบทชื่อดังอย่าง Prime number theorem ที่พูดถึงเรื่องนี้ จำนวนจำนวนเฉพาะที่ไม่เกิน n จะประมาณได้ด้วย n/log n และความหนาแน่นของจำนวนเฉพาะใกล้ n จะลู่เข้าเป็น 1/log n ดูคำอธิบาย Prime number theorem ของผม และWikipedia ได้
หัวข้อนี้มีงานวิจัยเยอะมาก Wikipedia
คนส่วนใหญ่ก็คิดแบบนั้น เพราะเราเรียนมาว่าการหาเลขเฉพาะเป็นเรื่องยาก แต่จริง ๆ แล้วการหาเลขเฉพาะไม่ได้ยาก สิ่งที่เรารู้สึกว่ายากคือการตัดสินว่าจำนวนเต็มหนึ่งตัวเป็นจำนวนเฉพาะหรือไม่ มากกว่า ที่จริงแล้วจำนวนเฉพาะยังมีมากกว่าจำนวนกำลังสองเสียอีก
เมื่อค่า cols เป็นจำนวนเฉพาะ แพตเทิร์นจะออกมาสวยมาก
ถ้า columns เป็นจำนวนเฉพาะ p ตัวเลขในแต่ละคอลัมน์จะมีเศษเท่ากันเมื่อหารด้วย p ดังนั้นพหุคูณของ p จึงไม่เป็นจำนวนเฉพาะ ทำให้เกิดแพตเทิร์นตามแนวทแยง
ไม่ใช่แค่ตอนที่จำนวนคอลัมน์เป็นจำนวนเฉพาะ แต่ตอนที่ cols+1 หรือ cols-1 มีตัวหารเยอะ ๆ (เช่น 25, 91, 119) ก็ได้แพตเทิร์นที่น่าสนใจเหมือนกัน ตัวเลขใกล้จำนวนเฉพาะที่มีตัวหารมากก็น่าสนใจดี
ตอนคอลัมน์เป็น 7 จะเห็นแนวทแยงจากขวาบนไปซ้ายล่างเยอะมาก ส่วนตอนเป็น 5 จะเห็นจากซ้ายบนไปขวาล่าง ผมยังสงสัยเรื่องความถี่ของ sexy prime ที่ต่อเนื่องกันอยู่ด้วย และอยากรู้ว่าแพตเทิร์นนี้จะพังลงไหมเมื่อไปที่ตัวเลขใหญ่ ๆ
แพตเทิร์นตอน
cols % 30 == 0(30, 60, 90, 120 ฯลฯ) น่าสนใจมาก มีเส้นแนวตั้งตรงเด่นชัด ถ้าบวกหรือลบ 1 (119 หรือ 121) เส้นจะดูเหมือน “หมุน” ไปทางซ้ายหรือขวา เป็นเครื่องมือแสดงภาพที่ยอดเยี่ยมจริง ๆแพตเทิร์นส่วนใหญ่ที่เห็นจริง ๆ แล้วไม่ใช่คุณสมบัติของจำนวนเฉพาะ ถ้าแสดงแค่ตัวเลขที่ไม่หารลงตัวด้วยจำนวนธรรมชาติ 100 ตัวแรก ก็จะได้ภาพเกือบเหมือนกัน
เมื่อไม่นานมานี้ผมก็ทำเครื่องมือแสดงภาพจำนวนเฉพาะเหมือนกัน:
https://ilmenit.github.io/prime-fold/
มันไม่ใช่แค่การแสดงภาพ แต่เป็นเครื่องมือที่ใช้ evolutionary algorithm และ fitness function เพื่อค้นหาฟังก์ชันทางคณิตศาสตร์ที่สร้างหรือครอบคลุมจำนวนเฉพาะ
โหมด PrimeFold (2D embedding): ใส่หรือวิวัฒน์ฟังก์ชันสองตัว f_x(n), f_y(n) เพื่อแมปตัวเลขไปยังพิกัด 2D แล้วแสดงจำนวนเฉพาะกับจำนวนประกอบต่างกัน ตัวอย่าง: f_x(n) = n, f_y(n) = n^2
โหมด PrimeGen (1D generation): ใส่หรือวิวัฒน์ฟังก์ชันเดียว f(n) เพื่อสร้างลำดับตัวเลข จากนั้นแสดงว่าค่าที่ได้แต่ละตัวเป็นจำนวนเฉพาะหรือไม่ และมีจำนวนเฉพาะไม่ซ้ำกันกี่ตัว ตัวอย่าง: f(n) = 2*n + 1
ถ้าตั้งเป็น 1, 7, 100 จะให้ความรู้สึกเหมือนดู ticker tape ของกลุ่มดาวใน chevron ของ Stargate เลย :D
ที่ลิงก์นี้ ถ้าซูมออกแล้วค่อย ๆ เพิ่มหรือลดค่า cols ทีละ 1 จะเห็นการเปลี่ยนแปลงของแพตเทิร์น ช่วง -7 ถึง +5 น่าประทับใจมาก ที่ #1-200-420 ก็เหมือนกัน
ผมลองเขียน Python เล่น ๆ เพื่อเปรียบเทียบเลขหลักหน่วย (ฐาน 10) ของจำนวนเฉพาะที่ต่อเนื่องกัน แล้วพบความสัมพันธ์ที่น่าสนใจ ตัด 2 กับ 5 ออกเพราะโผล่มาอย่างละครั้ง จากนั้นนับความถี่การเปลี่ยนจาก 1->3, 1->5, ... ระหว่างหลักหน่วยต่าง ๆ เดิมคิดว่าจำนวนเฉพาะน่าจะสุ่ม เลยคาดว่าความถี่คงแทบเท่ากันหมด แต่กลับมีความแตกต่างที่มีนัยสำคัญทางสถิติ ซึ่งจนถึงตอนนี้ก็ยังไม่มีใครรู้ว่าทำไม
ตามสัญชาตญาณของผม จำนวนเฉพาะน่าจะหายากกว่านี้มาก และอัตราการลดลงก็น่าจะเร็วขึ้นมากเมื่อเลขใหญ่ขึ้น แต่ความจริงคือมันยังมีอยู่เยอะมาก ที่ [1, 10,000, 10,000] ส่วนล่างยังค่อนข้างหนาแน่นอยู่ แน่นอนว่ามันเบาบางลงบ้าง ค่าเฉลี่ยของช่องว่างระหว่างจำนวนเฉพาะคือ
log(n)(prime number theorem)