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ü
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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...
P.Safa:Yaşlanarak değil, yaşayarak tecrübe kazanılır.Zaman insanları değil,armutları olgunlaştırır
C.Yücel:Toprak gibi olmalısın! Ezildikçe sertleşmelisin!Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı
S.Canan:Bildiğini zannettiğin an hiç bir şey öğrenemezsin
Bilgi uçar
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üş.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#17
(28-09-2018, Saat: 07:25)ssahinoglu Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.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.
P.Safa:Yaşlanarak değil, yaşayarak tecrübe kazanılır.Zaman insanları değil,armutları olgunlaştırır
C.Yücel:Toprak gibi olmalısın! Ezildikçe sertleşmelisin!Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı
S.Canan:Bildiğini zannettiğin an hiç bir şey öğrenemezsin
Bilgi uçar
WWW
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi