Orta kare yöntemi - Middle-square method

Orta kare yönteminin bir iterasyonu, altı basamaklı bir tohum gösteren, daha sonra karesi alınır ve elde edilen değer, çıktı değeri olarak ortadaki altı haneye sahiptir (ve ayrıca sıra için bir sonraki çekirdek olarak).
Yönlendirilmiş grafik orta kare yöntemi kullanılarak elde edilen 100 adet 2 basamaklı sözde rasgele sayının tümü n = 2.

İçinde matematik, orta kare yöntemi üretme yöntemidir sözde rasgele sayılar. Pratikte iyi bir yöntem değildir, çünkü dönem genellikle çok kısadır ve bazı ciddi zayıflıkları vardır; Yeterince tekrarlandığında, orta kare yöntemi ya tekrar tekrar aynı sayıyı üretmeye başlayacak ya da dizideki bir önceki sayıya dönecek ve sonsuza kadar döngü yapacaktır.

Tarih

Matematikte

Yöntem tarafından icat edildi John von Neumann ve 1949'da bir konferansta anlatıldı.[1]

1949 konuşmasında Von Neumann, "Rastgele rakamlar üretmenin aritmetik yöntemlerini düşünen herkes elbette günah durumundadır." Demek istediği, gerçek "rastgele sayılar" olmadığı, sadece onları üretme aracı olduğu ve orta kare yöntemi gibi "katı bir aritmetik prosedürün" "böyle bir yöntem olmadığı" idi. Yine de bu yöntemleri "gerçekten" rastgele sayıları okumaktan yüzlerce kat daha hızlı buldu. delikli kartlar onun için pratik önemi olan ENIAC iş. O, orta kare dizilerinin "yıkılmasının" onların lehine bir faktör olduğunu gördü, çünkü kolayca tespit edilebilirdi: "Kişi her zaman tespit edilmeyen kısa döngülerin ortaya çıkmasından korkar."[1] Nicholas Metropolis "orta kare" yöntemiyle 38 bitlik sayılar kullanılarak "yok edilmeden" önce 750.000 basamaklı diziler bildirildi.[2]

İlk buluş teorisi

Kitap Kırık Zar tarafından Ivar Ekeland Yöntemin 1240-1250 yılları arasında sadece Edvin Kardeş olarak bilinen bir Fransisken rahibi tarafından nasıl icat edildiğine dair geniş bir açıklama verir.[3] Sözüm ona el yazması artık kayboldu, ama Jorge Luis Borges Ekeland'a yaptığı bir kopyayı Vatikan Kütüphanesi'nde gönderdi.

Yöntem

Bir n basamaklı sözde rasgele sayılar dizisi oluşturmak için, n basamaklı bir başlangıç ​​değeri oluşturulur ve 2n basamaklı bir sayı üreterek karesi alınır. Sonuçta 2n'den az basamak varsa, baştaki sıfırlar telafi etmek için eklenir. Sonucun orta n rakamı dizideki bir sonraki sayı olur ve sonuç olarak döndürülür. Bu işlem daha sonra daha fazla numara üretmek için tekrarlanır.

Yöntemin çalışması için n'nin değeri çift olmalıdır - eğer n'nin değeri tek ise, o zaman seçim için benzersiz bir şekilde tanımlanmış bir 'orta n-basamak' olması gerekmez. Aşağıdakileri düşünün: 3 basamaklı bir sayının karesi varsa, 6 basamaklı bir sayı verebilir (örneğin: 5402 = 291600). Ortada sol ve sağ tarafa dağıtılacak 6 - 3 = 3 hane bırakacak bir orta üç rakam olsaydı. Bu rakamları orta sayının her iki tarafına da eşit olarak dağıtmak imkansızdır ve bu nedenle 'orta rakamlar' yoktur. Eşit değerli bir n-basamak oluşturmak için tohumları sola sıfırlarla doldurmak kabul edilebilir (örneğin: 540 → 0540).

Bir jeneratör için n-digit sayılar, dönem 8'den uzun olamazn. Orta eğer n rakamların tümü sıfırdır, jeneratör sonsuza kadar sıfır verir. Dizideki bir sayının ilk yarısı sıfırsa, sonraki sayılar sıfıra düşecektir. Bu sıfır akışlarının tespit edilmesi kolay olsa da, bu yöntemin pratik kullanım için çok sık meydana gelirler. Orta kare yöntemi, sıfırdan farklı bir sayıya da takılabilir. İçin n = 4, bu 0100, 2500, 3792 ve 7600 değerleriyle gerçekleşir. Diğer çekirdek değerleri çok kısa tekrar eden döngüleri oluşturur, örneğin, 0540 → 2916 → 5030 → 3009. Bu fenomenler, n = 2, olası 100 tohumdan hiçbiri 0, 10, 50, 60 veya 24 ↔ 57 döngüsüne geri dönmeden 14'ten fazla yineleme oluşturmadığından.

Örnek uygulama

Burada algoritma, Python 3.

seed_number = int(giriş("Lütfen dört basamaklı bir sayı girin: n[####] "))numara = seed_numberçoktan görüldü = Ayarlamak()sayaç = 0süre numara değil içinde çoktan görüldü:    sayaç += 1    çoktan görüldü.Ekle(numara)    numara = int(str(numara * numara).zfill(8)[2:6])  # zfill, sıfırların dolgusunu ekler    Yazdır(f"#{counter}: {numara}")Yazdır(f"İle başladık {seed_number}, ve"      f"sonra kendimizi tekrarladık {counter} adımlar "      f" ile {numara}.")

Orta Kare Weyl Sırası PRNG

Orijinal orta kare oluşturucu ile ilişkili kusurlar, orta kareyi bir Weyl dizisi[4][5]. Weyl dizisi, sıfıra yakınsamayı engeller. Weyl dizisi ayrıca yukarıda açıklanan tekrarlanan döngü problemini de önler. Bir C uygulama aşağıda gösterilmiştir.

#Dahil etmek <stdint.h>uint64_t x = 0, w = 0, s = 0xb5ad4eceda1ce2a9;Çizgide statik uint32_t msws() {    x *= x;     x += (w += s);     dönüş x = (x>>32) | (x<<32);}

Weyl dizisi (w + = s), kareye eklenir. x. Orta 32 bit sağa kaydırılarak çıkarılır. Bu jeneratör BigCrush'ı geçer[6][7]. ve PractRand[8]. Bu, tüm istatistiksel testleri geçen en hızlı PRNG olabilir. Ücretsiz bir yazılım paketi mevcuttur İşte[5].

Bir karşı tabanlı Bu jeneratörün "kareler" adı verilen versiyonu artık mevcut. Görmek arXiv "Kareler: Hızlı Sayaç Tabanlı RNG" makalesi[9][10].

Referanslar

  1. ^ a b 1949 makaleleri 1951'e kadar yeniden basılmadı. John von Neumann, A.S.'de “Rastgele rakamlarla bağlantılı olarak kullanılan çeşitli teknikler”. Ev sahibi, G.E. Forsythe ve H.H. Germond, editörler, Monte Carlo Yöntemi, Ulusal Standartlar Uygulamalı Matematik Serisi Bürosu, cilt. 12 (Washington, D.C .: ABD Hükümeti Baskı Ofisi, 1951): s. 36–38.
  2. ^ Donald E. Knuth, Bilgisayar programlama sanatı, Cilt. 2, Seminumerical algoritmalar, 2. baskı (Okuma, Kütle .: Addison-Wesley, 1981), bölüm. 3, bölüm 3.1.
  3. ^ Ivar Ekeland (15 Haziran 1996). Kırık Zar ve Diğer Matematiksel Şans Hikayeleri. Chicago Press Üniversitesi. ISBN  978-0-226-19992-4.
  4. ^ Widynski, Bernard (Nisan 2017). "Orta Kare Weyl Sırası RNG". arXiv:1704.00358v5.
  5. ^ a b Middle Square Weyl Sequence RNG web sitesi.
  6. ^ Pierre L'Ecuyer ve Richard Simard (2007), "TestU01: Rasgele Sayı Üreteçlerinin Ampirik Testi için ANSI C'de Bir Yazılım Kitaplığı ", Matematiksel Yazılımda ACM İşlemleri, 33: 22.
  7. ^ TestU01 web sitesi.
  8. ^ Chris Doty-Humphrey (2018), "Pratik Olarak Rastgele: RNG'ler için istatistiksel testlerin C ++ kitaplığı. "sürüm 0.94.
  9. ^ Widynski, Bernard (Nisan 2020). "Kareler: Hızlı Sayaç Tabanlı RNG". arXiv:2004.06278v3.
  10. ^ Squares RNG web sitesi.

Ayrıca bakınız