Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Dört işlem kullanarak en kısa yoldan üs hesaplamak.
#11
Döngü ile tek tek yapılırsa işlemlerin çoğu gereksiz oluyor. Zaten yukarıda yapılan işlemi tekrar yapıp vakit kaybetmiş oluruz.
a^8 için;
a
a*a
a*a*a
a*a*a*a
a*a*a*a*a
a*a*a*a*a*a
a*a*a*a*a*a*a
a*a*a*a*a*a*a*a
...

yerine

a^1 = a
a^2 = a*a (b)
a^4 = b*b ©
a^8 = c*c
...


En sonunda bu işlemi genelleştirmek gerekiyor.
Cevapla
#12
Ben anlamadım olayı, örneklermisiniz

Bazen kafa geç basar Smile

2^10000 = 10.000 döngü
2^10000 = ((2^100)^100) 100+100 döngü
WWW
Cevapla
#13
Bazen kendimi trolleniyormuş gibi hissediyorum.  Smile   Ben de anlamadım.
---------
Konuya dönecek olursak, tabanı büyütüp üssü küçülterek de "yaklaşık" bir sonuç bulunabilir.

Mesela;

3^10000 = 243^2000 ile benzerdir diyebiliriz. Burada 243 sayısı 3'ün 5. kuvvetidir. 2000 ise 10000/5'e eşittir. Yani 3^10000 = (3^5)^(10000/5) şeklinde de ifade edebiliriz... Bu tarz bir genelleme de yapılabilir...
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#14
Aslında siteye girmeye pek fırsatım olmadığı için detaylı yazamadım. Şimdi çözümü ve Delphi ile ilgisini yazayım.

TABAN^ÜS değerini en kısa yolsan hesaplamak için ÜS değeri 2'lik düzende yazılır.
Yaklaşık 15-20 kadar işlemde sonucu hesaplayabiliriz.


3^5000 = ?

5000 = (1001110001000)2 = 2^12 + 2^9 + 2^8 + 2^7 + 2^3

3^5000 = 3^(2^12) * 3^(2^9) * 3^(2^8) * 3^(2^7) * 3^(2^3)


Polinom şeklinde ifade edeceğiz. Her aşamada bir önceki hesaplanmış sonucun karesini kullanacağız.




3^(2^0) = 3
3^(2^1) = 3^2  (Her aşamada bir öncekinin karesi ...)
3^(2^2) = (3^2)^2
3^(2^3) = ((3^2)^2)^2
3^(2^4) = ...
3^(2^5) = ...
3^(2^6) = ...
3^(2^7) = ...
3^(2^8) = ...
3^(2^9) = ...
3^(2^10) = ...
3^(2^11) = ...
3^(2^12) = ...


12'ye kadar her seferinde bir öncekinin karesini hesapladıktan sonra, polinomdaki gerekli kısımları seçip birbiri ile çarpıyoruz.


3^5000 => Dizinin 3,7,8,9,12'inci elemanlarının çarpımıdır.


Böylece bir sayının 5000. üssünü toplam 12+5 çarpma işlemiyle bulmuş olduk.


Yıllar önce üniversitede okurken güya keşif yaptığımı zannedip boğaziçi mühendislikte okuyan bir arkadaşa gösterdiğimde, biz bunu zaten görmüştük, ama üssü ikilik değil, karekökün karekökü diye alarak yapıyorduk demişti. Sonradan baktım iki yöntem de bazen birkaç farkla birbirini geçebiliyor.

Algoritmayı optimize edip C koduna çevirmiştim ve C'nin üs işleminden daha hızlı sonuç veriyordu.

Ama asıl hayal kırıklığını Delphi nasıl yapmış diye baktığımda yaşamıştım. Delphi'nin tamsayı üs alma fonksiyonu bile bu yöntemi kullanmış meğer.
Cevapla
#15
Ellerinize sağlık.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#16
Programlama ile uğraşmak insanın matematiği sevmesini ve ufkunu açmasını sağlıyor.
Elinize sağlık çok güzel bir çözümmüş.
WWW
Cevapla
#17
(28-09-2018, Saat: 07:25)ssahinoglu Adlı Kullanıcıdan Alıntı: Aslında siteye girmeye pek fırsatım olmadığı için detaylı yazamadım. Şimdi çözümü ve Delphi ile ilgisini yazayım.

TABAN^ÜS değerini en kısa yolsan hesaplamak için ÜS değeri 2'lik düzende yazılır.
Yaklaşık 15-20 kadar işlemde sonucu hesaplayabiliriz.


3^5000 = ?

5000 = (1001110001000)2 = 2^12 + 2^9 + 2^8 + 2^7 + 2^3

3^5000 = 3^(2^12) * 3^(2^9) * 3^(2^8) * 3^(2^7) * 3^(2^3)


Polinom şeklinde ifade edeceğiz. Her aşamada bir önceki hesaplanmış sonucun karesini kullanacağız.




3^(2^0) = 3
3^(2^1) = 3^2  (Her aşamada bir öncekinin karesi ...)
3^(2^2) = (3^2)^2
3^(2^3) = ((3^2)^2)^2
3^(2^4) = ...
3^(2^5) = ...
3^(2^6) = ...
3^(2^7) = ...
3^(2^8) = ...
3^(2^9) = ...
3^(2^10) = ...
3^(2^11) = ...
3^(2^12) = ...


12'ye kadar her seferinde bir öncekinin karesini hesapladıktan sonra, polinomdaki gerekli kısımları seçip birbiri ile çarpıyoruz.


3^5000 => Dizinin 3,7,8,9,12'inci elemanlarının çarpımıdır.


Böylece bir sayının 5000. üssünü toplam 12+5 çarpma işlemiyle bulmuş olduk.


Yıllar önce üniversitede okurken güya keşif yaptığımı zannedip boğaziçi mühendislikte okuyan bir arkadaşa gösterdiğimde, biz bunu zaten görmüştük, ama üssü ikilik değil, karekökün karekökü diye alarak yapıyorduk demişti. Sonradan baktım iki yöntem de bazen birkaç farkla birbirini geçebiliyor.

Algoritmayı optimize edip C koduna çevirmiştim ve C'nin üs işleminden daha hızlı sonuç veriyordu.

Ama asıl hayal kırıklığını Delphi nasıl yapmış diye baktığımda yaşamıştım. Delphi'nin tamsayı üs alma fonksiyonu bile bu yöntemi kullanmış meğer.


Harika, bilgi için teşekkürler.
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi