Çok ilginç motorlar (Lütfen okumadan ve düşünmeden yazmayalım)

emrahozmen

MB Üyesi
Kayıt
20 Mart 2015
Mesajlar
22
Tepkiler
8
Yaş
43
Üniv
erciyes
olmaz. koddaki değişken kapasitesi bu sayıyı saklayamaz. çünkü 33 milyon /8 kadar byte tipinde veri tutmalı. bu da 4 milyon küsür byte eder. biginteger değişkeni 50 byte saklıyor. geriye kalan 33 milyon küsür byte nerede saklanacak?

kod mu yarıştıracaz :D peşinen söyleyim ben çekilirim. senin kodların kazansın.

ben karşılaştığım sorunu söyledim. algoritmada sorun yok. gayet hızlı çalışıyor. sorun şurda bulunan sonuçları saklayacak yer yok. yazılarımda da iki kere belirttim.

kodlar zaten nesneye yönelik, bu şekilde olmazsa ipin ucu kaçar. multi thread olursa fazla sayıda thread açılamıyor. oda tek pc de bir işe yaramıyor fakat paralel işlemcili yapıda çalışır ve sonucu elbetteki kısaltır. yapı buna uygun yapıda.

kod gönderirim saklayacak bir şey yok.

sadece üs alma kısmını gösteren kod

Kod:
procedure TForm1.ButtonSagKisimClick(Sender: TObject);
var i,t,d:integer;
    toplam,aratoplam:int64;
begin
aratoplam:=0;
for i:=1 to n do
  begin
  Application.ProcessMessages;
   toplam:=0;
   d:=i;
   t:=1;
   if i mod 1000 =0 then
   StatusBar1.SimpleText:='Sağ kısım, n = '+inttostr(n)+' ilerleme = '+inttostr(i);
        repeat
        toplam:=toplam+s[d]*s[t];
        d:=d-1;
        t:=t+1;
        until  d=0 ;
   c[i]:=toplam+aratoplam;
  aratoplam:=strtoint64(copy(inttostr(c[i]),1,length(inttostr(c[i]))-4));
   c[i]:=strtoint64(copy(inttostr(c[i]),length(inttostr(c[i]))-3,4));
   end;
atop:=aratoplam;
end;
//----***-------------------Emrah------------------------***----
procedure TForm1.ButtonSolKisimClick(Sender: TObject);
var i,d,t:integer;
    aratoplam2,toplam2:int64;
begin
r:=n;
aratoplam2:=atop;
for i:=2 to n do
  begin
  Application.ProcessMessages;
   toplam2:=0;
   d:=i;
   t:=n;
      if i mod 1000 =0 then
      StatusBar1.SimpleText:='Sol kısım, n = '+inttostr(n)+' ilerleme = '+inttostr(i);
        repeat
        toplam2:=toplam2+s[d]*s[t];
        d:=d+1;
        t:=t-1;
        until  d=n+1 ;
   r:=r+1;
   c[r]:=toplam2+aratoplam2;
   if (length(inttostr(c[r]))-4)<=0 then
   aratoplam2:=0 else
  aratoplam2:=strtoint64(copy(inttostr(c[r]),1,length(inttostr(c[r]))-4));
   c[r]:=strtoint64(copy(inttostr(c[r]),length(inttostr(c[r]))-3,4));
   end;
   r:=r+1;
  c[r]:=aratoplam2;
end;
buradan ekranda şu sonuç çıkıyor.



upload_2017-11-5_22-18-28.png


6 sn de;

2 ^ 655360 sayısını bulmuş. bu sayı elbette asal değil. sadece hızını ve işlem kapasitesini gösterebilmek için çabucak yaptığım bir işlem.

sonucun basamak sayısı 197284 haneymiş.

isteyene word halinde 104227..... ile başlayan tam sayıyı gönderebilirim.

ya hala (1 milyar için) 9 hane için hızdan bahsediyorsun bırak bu küçük haneleri küçük hanelerde hız önemli değil. zaten asalların nette senin uğraştığın sayı aralıklarındaki tablolar var. çek onları makinene, kaydet dosyana, veritabanından göster. al sana 1 sn altında hız. büyükleri bulmak içinde bende yapı var. istiyosan kullan ama saklayacak yerin yokken ne işine yarayacak?

benim sıkıntım dolayısıyla asallardaki şu anki sıkıntı saklanamaması. bulmada sıkıntı yok. senin yapı üzerine baya bi çalıştıktan sonra tüm sayıları bulabilecek yapıya gelir. o aşamaya geldikten sonrada saklayacak yer bulamayacaksın.

ha şunu diyebilirsin ben tüm asalları bilmeden olasılık vererek bir sayının asal olup olmadığını söylerim diyebilirsin. bende derimki ispatla. işte o zaman benim gibi tüm asalları bulmak zorunda kalırsın. mesele tamda bu...
 
Konu sahibi
Konu sahibi
John Ahmet

John Ahmet

MB Üyesi
Kayıt
23 Ağustos 2017
Mesajlar
50
Tepkiler
16
Yaş
44
Üniv
Ege Universitesi
@emrahozmen kardeşim amacın nedir blockchain benzeri digital dünyayı derinden sarsan projeler peşinde misin? Bunu yapmaktaki nihai amacın nedir?

Ayrıca button click e kod yazıp bu kodun nesneye yönelik olduğunu iddia edip bu tartışmayı sen kazandın zaten, sana bundan sonra sensei demeyi düşünüyorum. Ben ancak çekirgen olarak yerleri temizleyebilirim :) ve seninle bu konuda yarışmaktan vazgeçiyorum. :(

Asal sayılar konusuyla ben de ilgiliyim. Yukarıda HugeInteger ın sayıları bir byte dizisinde sakladığını görebilirsin. Eğer ram in yeterliyse bu yöntem ile 2.147.483.647 byte ı saklayabilirsin dolayısıyla bu sayı ikilik sistemde 17.179.869.176 bit saklayabiliyorsun bu 4 milyon küsür byte ın yaklaşık 2000 katı büyüklükte bu sayı hafızada 2 GB yer kaplar ben de sana diyorum ki indisi HugeInteger olan bir array yapısı oluştur. Bu sınırlar ortadan kalksın ve dağıtık bir mimaride çalışan tek bir bilgisayarın ram ına ve diskine bağlı olmayan bir yapı kurabilesin.

2 ^ 17.179.869.176 gibi bir sayı için sence 2 GB kullanmaya gerek var mı bak ben bir kaç karakterle bu sayıyı yazabiliyorum. Hafıza yetersiz ise böyle sayıları daha pratik şekilde saklayabilirsin. Sadece işlem yaparken açarsın.

Sen ayrıca konumda termodinamiğe örnek vermek için bahsettiğim 2 ^ N mod N = 2 ise N büyük olasılıkla asaldır ve 2 den farklı ise kesinlikle asal değildir tezime yönelik hiç bir şey yazmadın. Bunu bir programda test edip yanlışlayabilir misin? Bütün asalların bu formülde 2 kalanını verdiğini iddia ediyorum. Bunun aksini ispatlayabilir misin? Bu tezim bir sayının asal olmadığını asal sayıları işlemde kullanmadan kesinlikle söyleyebiliyor.

Delphi için

Kod:
if (2 ^ N) mod N = 2 then
       ShowMessage('Büyük ihtimalle asal olabilir');
else
       ShowMessage('Kesinlikle asal değildir');
PrimeCoin isminde Bitcoin benzeri bir coin var. Asal sayıları bularak para kazanman bile mümkün.

Sana başarılar diliyorum. Asal sayılar ile ilgili bir başlık oluştur ki herkes tecrübelerinden faydalanabilsin.
 
Son düzenleme:

emrahozmen

MB Üyesi
Kayıt
20 Mart 2015
Mesajlar
22
Tepkiler
8
Yaş
43
Üniv
erciyes
amaç gelişim tabii. ne kadar çok asal bilinirse şifreleme o kadar daha zor çözülür hale getirilir. başka bir boyutu da sıkıştırma algoritmaları bahsetmiştim ama yine bahsedeyim;

mevcut sıkıştırma teknikleri benzerlik üzerine ne kadar fazla sayıda tekrar eden varsa buna kısa kod verilir. vs. vs. burada eğer tüm kodlar kullanılmışsa sıkıştırma yüzdesi düşer zaten ve sıkışan dosyayı tekrar sıkıştıramayız.

eğer matematiksel olarak sıkıştırılırsa, sıkıştırma, dosya tipinden bağımsız olur ve yinelenebilir. bu şu demektir. istediğin dosyayı istediğin boyuta kadar sıkıştırabilirsin demektir.

benim amacıma gelirsek, verileri çok az yer kaplayacak şekilde saklamak ve dünyanın hızını veya kapasitesini mevcut donanımlarla kat ve kat artırmak. diğer sonuçlarına bakarsak şifreleme ilerleyecektir. güvenlik artacaktır v.s v.s

hedefim sükse yapmak meşhur olmak değil. kimse meşhur olayım diye bişey icat etmiş değil sanırım.

button click e kod yazınca nesneye yönelik olmuyo mu? :) öyleyse sadece konsol uygulamaları object oriented. tamam benim kodum kara düzen kopyala yapıştır. yanlış söylemişim. (düzelttik sanırım)

hugeinteger tipini bir önceki mesajda yazmışsın bu tipi yeni oluşturdun sanırım. buna ait metodlar şimdi yazılacak. o zaman neyi tartışıyoz? yeni yapılacak yapıda hugeinteger tipini oluşturur gerekli metodları yazarsa(n)/(k) herhalde olur. doğmamış çocuk misali. neyi tartışıyoz. yapacaksan yap görelim. yapacaksak eğer, bende önceki mesajda biginteger ile olmayacağını söyledim. sonrasında zaten bu mevzu bahis oldu.

sonrasında da bu kadar hesap yapıp zaman kaybetmene gerek yoktu. byte array olursa sınırlarıda biz belirleyebiliyorsak ki böyle bir yapıyı oluşturan biz isek, zaten istediğimizi yapabiliriz. öyle değil mi?

dediklerini zaten yaptığımı ya da yapacağımı anlatmaya çalışıyorum. ama sen hala mevzuyu anlayamadın yada tam kavrayamadım. benim yapıda senin tanımladığın hugeinteger tipine karşılık gelen yapı zaten var. olmasa ekran görüntüsündeki sayı elde edilebilir mi? (evetse hiç bahsetme, hesap ta yapma, sende kalsın)

birçok pc de çalışan yapıyı pek ala kurgulayabiliyorum. sonuçta ne yapılması gerektiğini sormadım ama bilgi verdin sağol. bana bilgi değilde ihtiyacım olan harddisk ya da pc ihtiyacına çözüm bulsa(n)/(k) daha makbule geçerdi.

bişeyi (2 ^ N mod N = 2 ise N büyük olasılıkla asaldır ) ispata hiç niyetim yok hatta isteğim de yok. tezi ortaya atan ispatlamalı. ispat edersende ne ala etmesende ne ala. (büyük olasılıkla asaldır diye tanım olan bişeyi nasıl ispatlayım, olasılık olduğu için evet doğru. olasılık, içinde iki cevabıda saklar evetide, hayırıda. hayır desemde doğru. büyük olasılık nedir peki? hangi sınıra kadar N kaç basamak mesela? bende uzun uzun sabırla yazıyorum.)

asal sayıları bulup para kazanabilir demişsin. bunu da biliyorum ama sorun yine aynı sorun, dönüp dolaşıp hep aynı yere geliyoruz. sayılar büyük olunca küçük hafıza ve işlemcilerle (ya da az sayıda pc ile) bu işin olamayacağını anlattım. anlatmaya çalıştım. sanırım becerememişim. asal sayı bulmak ki benim bahsettiğim n basamaklı desimal sayılar (n >1.000.000) bu sayılarda işlem yapmak için çok sayıda hafızaya ve işlemciye ihtiyaç duyuluyor. tek makine ile çok çok uzun yıllarda sonuca ulaşılabilir.

şimdilik yeni bir başlığa gerek yok sanırım. varsa da açarız problem değil.

sanada başarılar
 
Konu sahibi
Konu sahibi
John Ahmet

John Ahmet

MB Üyesi
Kayıt
23 Ağustos 2017
Mesajlar
50
Tepkiler
16
Yaş
44
Üniv
Ege Universitesi
Ne söylersen söyle karşıdakinin anladığı kadardır. 3 mili saniye diyor. Senin sürenin 2000' de biri kadar umarım anladın.



Kod:
using System;
using System.Numerics;

namespace BigIntegerTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var  startTime = DateTime.Now;

            var number = BigInteger.Pow(2, 655360);

            var numberCalculationTime = DateTime.Now - startTime;

            //var digits = number.ToString().Length;
            int digits = (int)Math.Floor(BigInteger.Log10(number) + 1);

            var calculationTime = DateTime.Now - startTime;

            Console.WriteLine("2 ^ 655360 sayısı bulundu. Bulunan sayı toplam {0} basamak. İşlem süresi (digit hesaplama dahil) tüm süre {1} sayıyı hesaplama süresi {2} ekrana yazdırılacak...", digits, calculationTime, numberCalculationTime);


            Console.WriteLine();
            Console.WriteLine(number);

            var withPrintTotalCalculationTime = DateTime.Now - startTime;

            Console.WriteLine("Yazdırma süresi dahil toplam süre {0}", withPrintTotalCalculationTime);

            Console.ReadLine();
        }
    }
}
Tezimle ilgili asal sayılarla uğraşmış biri olarak bu senin dikkatini çekmiyorsa başka bu konuda yazmak istemiyorum. Yani bu aralıktaki bütün asalların 2 kalanını veriyor olması durumundan bahsediyorum. Asal olmayanlar ise fermat pseudo sayıları hariç 2 kalanını vermiyor. Ancak bu oran çok düşük bu nedenle büyük olasılıkla asaldır diyorum.



Kod:
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Numerics;

namespace TestMyHypotesis
{
    class Program
    {
        static void Main(string[] args)
        {
            var startTime = DateTime.Now;

            var primes = new Primes(10000000); // On milyondan küçük asal sayılar.

            var list = primes.Skip(1); // Skip ile 2 yi dışlıyoruz o hariç

            foreach (var prime in list)
            {
                // 2 ^ N mod N değeri hesaplanıp 2 ile karşılaştırılıyor farklıysa tezim yanlış olacaktır.
                // BigInteger.ModPow static methodu bu işe yarıyor.
                if (BigInteger.ModPow(2, prime, prime) != 2)
                {
                    Console.WriteLine("Tezim yanlışmış. Çok üzüldüm. {0} için geçerli değilmiş.", prime);
                }
            }

            var calculationTime = DateTime.Now - startTime;

            Console.WriteLine("{0} asal için test yapıldı. İşlem süresi {1}", primes.Count - 1, calculationTime);
            Console.WriteLine("Tezim bu aralık için doğru görünüyor.");
        

            Console.ReadLine();
        }
    }

    public class Primes : IEnumerable<ulong>
    {
        private ulong limit;
        private ulong count;
        private bool[] numbers;
        private DateTime startTime;
        private TimeSpan calculatationTime;

        public Primes(ulong limit)
        {
            this.count = 0;
            this.limit = limit;
            this.numbers = new bool[limit];
            startTime = DateTime.Now;
            findPrimes(); // limit değerinden küçük bütün asallar bu method ile bulunuyor.
            calculatationTime = DateTime.Now - startTime; // süre hesaplanıyor
        }

        private void findPrimes()
        {
            // Şu an numbers dizisinin tüm elemanları false değerindedir.
            // limitten küçük bütün tek sayılar true yapılıyor (1 hariç çünkü artık asal olarak kabul edilmiyor).
            for (ulong i = 3; i < limit; i += 2) numbers[i] = true;
            // 2 çift olan yegane asal sayıdır (özel durum).
            if (limit > 2) numbers[2] = true;
            // 3 ten itibaren bütün tek sayılar dolaşılıyor.
            for (ulong j = 3; j * j <= limit; j += 2)
            {
                if (numbers[j])//is true
                    // Tek sayıların tek katları asal olmadığından değerler false yapılıyor.
                    for (ulong p = 3; (p * j) < limit; p += 2)
                        numbers[p * j] = false;
            }
        }

        public IEnumerator<ulong> GetEnumerator()
        {
            for (ulong i = 2; i < limit; i++)
                if (numbers[i])
                    yield return i;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }


        public ulong Count
        {
            get
            {
                if (count == 0)
                {
                    if (limit > 2) count++;
                    for (ulong i = 3; i < limit; i += 2)
                        if (numbers[i]) count++;

                    return count;
                }
                else return count;
            }
        }

        public bool[] Numbers { get { return numbers; } }
        public TimeSpan CalculationTime { get { return calculatationTime; } }
    }
}

Bu kodda bir sayının asal olup olmadığını sınayan bir kod dikkat et asal değil diyorsa kesinlikle asal değildir. Tezimle ilgili en önemli kısım da budur. Düşünmeden yazdığın için detayları kaçırıyorsun. Anlasan çok daha farklı şeyler yazacağına emin olduğum için bunu biliyorum. Ben senin bütün söylediklerini anlıyorum ancak bu senin için geçerli değil umarım anlıyorsundur. Üzgünüm :(

Kod:
public bool IsPrime(BigInteger number)
        {
            return BigInteger.ModPow(2, number, number) == 2; // 2 ^ N mod N = 2
        }
 
Son düzenleme:

emrahozmen

MB Üyesi
Kayıt
20 Mart 2015
Mesajlar
22
Tepkiler
8
Yaş
43
Üniv
erciyes
"Kesinlikle asal degil olmasi" kayda deger olabilir. Fakat tersi icin zaten diger carpanlarina bakip kontrol etmek gerekiyor. Kesin Asal degil dedigi ya asal cikarsa. O zaman cok fena olur
 
Konu sahibi
Konu sahibi
John Ahmet

John Ahmet

MB Üyesi
Kayıt
23 Ağustos 2017
Mesajlar
50
Tepkiler
16
Yaş
44
Üniv
Ege Universitesi
"Kesinlikle asal degil olmasi" kayda deger olabilir. Fakat tersi icin zaten diger carpanlarina bakip kontrol etmek gerekiyor. Kesin Asal degil dedigi ya asal cikarsa. O zaman cok fena olur
İkinci kod sadece prime leri test ediyor aynı aralıkta nonprime için de yaptım buraya aktarmadım. 10000000 (on milyon) a kadar test yapıyor. Daha büyük sayılar için de test yapılabilir ancak sonsuza kadar test yapamayız bunu bir matematikçi daha kolay ispatlayabilir. Ben matematikçi değilim.Birini tanıyorsan bundan bahset çok şaşıracaktır. KPSS kursuna giderken matematik öğretmenine bunu söyledim 2 gün uyku uyuyamamış çok şaşırdı. :) Matematikle çok ilgili çok sevdiğim bir öğretmendi ancak o bile ispat yapamadı ispat çok zor bir iş bana göre...
 
Son düzenleme:

emrahozmen

MB Üyesi
Kayıt
20 Mart 2015
Mesajlar
22
Tepkiler
8
Yaş
43
Üniv
erciyes
Bu yuzden kesin olmadikca o metodun kendiside terside cok riskli. Belirlenen metod zaten hizli. Asal olup olmadigini arastirmak gereksiz degil mi? Diger islemimiz cok yavas olsa bile bu teste guvenip islem yapmadan direkt asal degil ya da asaldir diyip gectigimizde ilerideki tum islemler icin suphe kalacak. Gereksiz yere neden bu risk almamiz gerekiyo bunu anlamadim. Ne gerek var ki islemlere saibe gelsin. Zaten hizli yapi. Hem problem bu degilki varsin bu testi kullandigimizi dusun sonra ne olacak hd de saklanmayacak kadar cok asal elde olacak. Ee simdi ne yapcaz? Madem benim dediklerimi anladin buna da bi cevabin vardir...
 
Konu sahibi
Konu sahibi
John Ahmet

John Ahmet

MB Üyesi
Kayıt
23 Ağustos 2017
Mesajlar
50
Tepkiler
16
Yaş
44
Üniv
Ege Universitesi
Bu yuzden kesin olmadikca o metodun kendiside terside cok riskli. Belirlenen metod zaten hizli. Asal olup olmadigini arastirmak gereksiz degil mi? Diger islemimiz cok yavas olsa bile bu teste guvenip islem yapmadan direkt asal degil ya da asaldir diyip gectigimizde ilerideki tum islemler icin suphe kalacak. Gereksiz yere neden bu risk almamiz gerekiyo bunu anlamadim. Ne gerek var ki islemlere saibe gelsin. Zaten hizli yapi. Hem problem bu degilki varsin bu testi kullandigimizi dusun sonra ne olacak hd de saklanmayacak kadar cok asal elde olacak. Ee simdi ne yapcaz? Madem benim dediklerimi anladin buna da bi cevabin vardir...
Bu tezi sana bak bunu kullan işlerini çok kolaylaştırır diye değil ilginç olması hasebiyle anlatıyorum. Ancak asalları bulurken eğer sen mod alma işlemi yapıyorsan bu çok yavaş bir algoritma bunun için sadece toplama ve çarpma işlemlerini içeren mod alma işlemine göre binlerce kat daha hızlı yapabilen asal bulma algoritması da paylaştım. Sırası gelmişken sen asalları nasıl tespit ediyorsun bunu paylaşabilir misin? Ayrıca keşke asallarla ilgili bir başlık açsan da bunu orada diğer arkadaşlarla birlikte tartışabilsek :( Özellikle senin konunda sıkıştırma algoritmalarıyla ilgili olarak...
 
Yukarı Alt