Kuvvet alan program

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 30 16:32:25 2018

@author: KEMAL
"""
## Birler basamağı 5 olan herhangi bir sayının kuvvetini
## işlemcinizi yormadan kolaylıkla hesaplayan algoritma

sayi = input("Kuvvetini almak istediğiniz sayıyı giriniz :")
ilk_sayi=""
for s in sayi:
    ilk_sayi += s 
    if(len(ilk_sayi)==(len(sayi)-1)): ## burada for döngüsünün ne zaman kırılacağını şarta bağlıyoruz
        break;
        
hesap = int(ilk_sayi)*(int(ilk_sayi)+1) #sonu 5 ile biten sayıların karesini alma formülünü koda çevirdik
kuvvet = str(hesap) + "25"              #hesaplanan değer sonuna 25 sayısını ekliyoruz.
kuvvet = int(kuvvet)
mesaj = "{} sayısının kuvveti {} dir"
print(mesaj.format(sayi,kuvvet))
print(type(kuvvet))
input()
2 Beğeni

Bu program, bir sayının karesini alıyor değil mi? O zaman 5 girdiğimizde sonuç 25 olmalı. Ancak bendeki sonuç 3025 olarak görünüyor. Bir sıkıntı var sanırım…

evet herhangi bir sayının karesini almak için pow() fonksiyonu basitçe kullanıp geçeriz ama benim burada yapmak istediğim şey herhangi bir sayının kuvvetini almıyor sadece birler basamağı 5 olan sayının kuvvetini işlemciyi yormadan hesaplıyor

Peki, bu durumda 5 sayısının da birler rakamı “5”. Bu durumda çalışıyor olması gerekir. Koda şöyle bir kısım ekleyebiliriz.

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 30 16:32:25 2018

@author: KEMAL
"""
## Birler basamağı 5 olan herhangi bir sayının kuvvetini
## işlemcinizi yormadan kolaylıkla hesaplayan algoritma

sayi = input("Kuvvetini almak istediğiniz sayıyı giriniz :")
ilk_sayi=""

if(sayi == "5"):
    ilk_sayi = "5"
    kuvvet = 25
else:
    for s in sayi:
        ilk_sayi += s
        if(len(ilk_sayi)==(len(sayi)-1)): ## burada for döngüsünün ne zaman kırılacağını şarta bağlıyoruz
            break;
        
    hesap = int(ilk_sayi)*(int(ilk_sayi)+1) #sonu 5 ile biten sayıların karesini alma formülünü koda çevirdik

    kuvvet = str(hesap) + "25"              #hesaplanan değer sonuna 25 sayısını ekliyoruz.
    kuvvet = int(kuvvet)

mesaj = "{} sayısının kuvveti {} dir"
print(mesaj.format(sayi,kuvvet))
print(type(kuvvet))
input()

Tabiki dediğiniz doğru koda bu kısım eklenebilir yorumunuz için teşekkürler, ama benim asıl amacım 1 veya 2 basamaklı sayılarda hesap yapmak değil 15 , 20 basamaklı sayılarda bu kodun hızını bilgisayarınızın hesap makinesinden bile hızlı çalıştığını test etmekti :slight_smile:

1 Beğeni

Evet bu konuda hemfikiriz. Ancak ben kodun tam çalışabilirliğine odaklanıyorum alışkanlıktan, kusura bakmayın. Yine de elinize sağlık :slight_smile:

Teşekkürler yorumlarınız için.

Rica ederim. Peki bir soru sormak istiyorum. bu kodun işlemciyi yormadığını neden düşünüyorsunuz?

bu koda girdi olarak uzun basamaklı sonu beş ile biten bir sayı girdiğinizde aldığınız yanıt süresi ile
aynı sayının karesini pow fonksiyonu ile hesaplatmaya çalıştığınızda aldığınız yanıt süresinin farkı üzerinden böyle bir varsayıma dayanıyorum.

1 Beğeni

Kodun çalışma mantığına bakarsak, girilen sayının son rakamına kadar bir string’e aktarılıyor. Ve daha sonra bu kısım kendisi ve kendisi+1 ile çarpılarak sonuna “25” ekleniyor ve sonuc olarak gösteriliyor. Yani 30 basamaklı ve sonu 5 ile biten bir sayıyı programa girersek, sadece 29 basamağı çarpılıyor ve sonuna 25 ekleniyor. 1 basamak eksik çarpma işlemi yani.

Aslında ikisinin işlemci için yaptığı etki hemen hemen aynıdır. Bir basamak eksik veya fazla olması bunu değiştirmez. Fark sadece birkaç nanosaniyedir.

Öncelikle yanlış anlamayın kodunuza gereksiz demiyorum, ancak günümüz işlemcileri için bu fark hiç ama hiç anlaşılmayacaktır.

örnek verelim mesala 125489644775215 sayısının karesini hesaplatmak pow fonksiyonu ne yapar bu sayıyı iki kere kendisiyle çarpar doğrumudur. fakat siz bir basamak eksik çarpma işlemi diyorsunuz ama bizim kodumuzda örneğin 25 basamaklı sayı için o bir basamağı 24 kez boşuna çarpma işlemine sokmuyoruz bu bir verimlilik değilmidir.

Evet bu açıdan bakarsak,çok az da olsa verimliliktir. Peki son rakama gelene kadar for döngüsünde harcadığımız zamanı ve if-else koşullarını da hesaba katmamız gerekmez mi?

hesaba katmamız tabiki gerekir ama biz burda for döngüsünde çokta komplike bir işlem yaptırmıyoruz keza if bloğunda da aynı şekilde.

Aslında tek basamak çarpma işlemi de öyle sayılır. Çok komplike bir iş sayılmaz. Burada konuştuğumuz konu aslında hiç hesaplamaya bile gerek bıraktırmayacak derecede bir kod. Neredeyse saniyenin milyarda biri kadar. Ancak benim öğrenmek amaçlı üzerine gittiğim konu, işlemcinin yorulmaması meselesi. Aslında yaptığımız çok basit bir çarpma işlemi. O kadar hızlı oluyor ki bu işlem, saniyenin milyarda birinde.

Yani bu çarpma metodunun, işlemciyi çok daha yorabilecek çarpma işlemlerinde(matris çarpma) nasıl etki edebilir, nasıl bir zaman tasarrufu sağlayabilir meselesi üzerine konuşmak istiyordum. Yaptığınız işlem de pratik bir işlem, matematikte bu tür kolay çarpmayı sağlayan başka “sihirli” yollar da var. Mesela 11 ile bir başka sayının çarpımı. Ancak benim düşüncem, kesinlikle işlemci bunu tınlamıyor.

Tekrardan elinize sağlık. Foruma hoşgeldiniz bu arada :slight_smile:

1 Beğeni

timeit modülünü kullanarak hız testine sokabilirsiniz.

1 Beğeni

Hoşbuldum üstadım :slightly_smiling_face:

1 Beğeni

Estağfurullah. Üstad olacak seviyede değiliz :slight_smile:

1 Beğeni

Algoritmanızın hızını pow fonksiyonunun hızıyla karşılaştıran bir program yazdım. Mesela, algoritmanız 125489644775215 sayısı için şu kadar saniye daha hızlı çalıştı: 3.005800000033254e-05 Kod:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 30 16:32:25 2018

@author: KEMAL
"""
## Birler basamağı 5 olan herhangi bir sayının kuvvetini
## işlemcinizi yormadan kolaylıkla hesaplayan algoritma

import time

sayi = input("Kuvvetini almak istediğiniz sayıyı giriniz :")
ilk_sayi=""

if(sayi == "5"):
    ilk_sayi = "5"
    kuvvet = 25
else:
    first_start = time.perf_counter()
    for s in sayi:
        ilk_sayi += s
        if(len(ilk_sayi)==(len(sayi)-1)): ## burada for döngüsünün ne zaman kırılacağını şarta bağlıyoruz
            break;
        
    hesap = int(ilk_sayi)*(int(ilk_sayi)+1) #sonu 5 ile biten sayıların karesini alma formülünü koda çevirdik

    kuvvet = str(hesap) + "25"              #hesaplanan değer sonuna 25 sayısını ekliyoruz.
    kuvvet = int(kuvvet)
    first_end = time.perf_counter()

mesaj = "{} sayısının kuvveti {} dir"
print(mesaj.format(sayi,kuvvet))

second_start = time.perf_counter()
pow_result = pow(int(sayi), 2)
second_end = time.perf_counter()

if kuvvet != pow_result:
    print('İlk algoritma yanlış hesap yapıyor...')

first_time = first_end - first_start
second_time = second_end - second_start

if first_time < second_time:
    result = 'İlk algoritma daha hızlıdır.'
else:
    result = 'İkinci algoritma daha hızlıdır.'

print(result, f'Fark: {abs(first_time - second_time)} saniye')
2 Beğeni

Teşekkür ederim emeğinize sağlık :+1:t2:

1 Beğeni

Değerli arkadaşlar,
Merak ettiğim bir şeyi sormak istedim.
Büyük sayıların çarpılması için, okullarda öğrendiğimiz yöntemin dışında, kriptolojide de kullanılan değişik çarpma algoritmaları var. Basit çarpma, Karatsuba, Nikhilam, Fürer, Peasant, Eski Mısır, Toom-Cook, Fourier, Schönhage-Strassen…ilh.
Merak ettiğim şey, acaba işlemci hangi algoritmayı kullanıyor? Yoksa logaritmik fonksiyonlar mı ya da bilinmeyen başka bir algo mu kullanılıyor?