Alston S. Householder
Dijital Bilgisayarlarla Problemlerin Çözümü
Alston S. Householder
Matematik Paneli
Oak Ridge Ulusal Laboratuvarı
Oak Ridge, Tennessee
(American Physical Society önünde sunulan konuşma, Washington, D.C., 26–28 Nisan 1956)
Yüksek hızlı dijital bilgisayarların hızları, makineden makineye birkaç mertebe büyüklük farkı gösterir; ancak oldukça temsil edici bir grup için çarpma süresi yaklaşık yarım milisaniyedir. IBM 701 ve Princeton tipi makineler için hız biraz daha düşüktür; IBM 704 için ise biraz daha yüksektir, ancak bu değer makul bir yuvarlak sayı olarak kabul edilebilir.
Oak Ridge Ulusal Laboratuvarı’ndaki Oracle, Princeton tipi bir makinedir ve dolayısıyla bu sınıfa dâhildir; ayrıca en iyi tanıdığım makine olduğu ve “Oracle” sözcüğü söylenmesi kolay olduğu için, bu sınıfın temsilcisi olarak Oracle’ı kullanmak istiyorum.
Oracle’da bir bölme işlemi yaklaşık olarak bir çarpma kadar zaman alır; bu nedenle çarpmalardan söz edebilir ve bir bölmeyi eşdeğer kabul edebiliriz. Zaman açısından ve gerçekleşme yüzdesi bakımından, bir çarpma yaklaşık on adet tek adresli toplama işlemine eşdeğerdir.
Standart bir masa tipi hesap makinesi kullanan yetenekli bir insan operatör — kısaca Joe diyelim — işlenen değerlerin girilmesi ve sonuçların kaydedilmesi için geçen süre dâhil olmak üzere, bir iş gününde yaklaşık 1.000 çarpma yapabilir. Hastalık, tatil ve kahve molaları için zaman payı bırakırsak, haftada 4.000 belki de daha iyi bir genel ortalamadır.
Bu, bir çalışma yılında yaklaşık 2 × 10⁵ çarpma ya da beş yılda 10⁶ anlamına gelir. Elli çalışma yılını üretken bir insan ömrü olarak kabul edersek, Joe masa tipi bir hesap makinesinde ömrünü çarpma yaparak geçirirse, toplamda yaklaşık 10⁷ işlem gerçekleştirecektir.
Horner olarak bilinen, iyi tanımlanmamış ancak yaygın bir hesaplama hacmi birimi vardır. Bunu basılı hâlde hiç görmedim, ancak anladığım kadarıyla Horner yöntemi kullanılarak belirli bir derecedeki bir cebirsel denklemin çözümü için gereken hesaplama emeğini temsil eder.
Horner’ın 10⁶ çarpmayı ya da bunların eşdeğerini temsil ettiğini varsayacağım. Bu terimlerle, Joe’nun bir Horner üretmesi yaklaşık beş yıl alırken, Oracle yaklaşık sekiz dakika gerektirir. Aynı terimlerle, Dahlgren’deki NORC yaklaşık bir dakika, iki yıl sonra Livermore’a teslim edilecek olan LARC ise yaklaşık sekiz saniye gerektirir.
Bu son rakamlar oldukça kabadır ve karşılaştırmalar zordur; çünkü NORC ve LARC kayan nokta makineleridir ve bu da onlara belki bir mertebe daha yüksek etkin hız kazandırır. Öte yandan, şu anda çıktının yararlılığını değil, yalnızca etkinliğin kaba, genel ve makul ölçüde iyi tanımlanmış bir ölçüsünü arıyorum.
Arkadaşımız Joe’ya ve masa tipi hesap makinesine geri dönersek, onun yalnızca bir lise mezunu olduğunu, istikrar ve güvenilirlik dışında özel bir yeteneği bulunmadığını varsayarsak, maaşı ve genel giderleri muhtemelen yılda en az 5.000 dolar tutacaktır. Dolayısıyla çıktısının maliyeti Horner başına yaklaşık 25.000 dolardır. Joe haftada 40 saat çalışırken, Oracle’ın haftası şu anda 120 saattir. Amortismanı yılda 200.000 dolar olarak hesaplarsak — ki bu oldukça yüksektir — saat başına yaklaşık 30 dolara gelir. Normal işletme giderleri saat başına yaklaşık 50 dolardır ve bu da Horner başına yaklaşık 10 dolar eder.
LARC, Oracle’dan yaklaşık üç kat daha pahalıya mal olacaktır. İşletme giderleri için de aynı çarpanı ve hızlar için 60 çarpanını kabul edersek, Horner başına 50 sentlik bir maliyet elde ediyorum; bu, Joe ile karşılaştırıldığında 5·10⁴ faktörlük bir farktır.
Yararlılığın dikkate alınmadığını bir kez daha vurgulamalıyım. Belirli bir problem için, tek bir sistemde bile, programlama ve analizde gösterilen özene bağlı olarak gereken Horner sayısı kolayca bir mertebe değişebilir. Ancak makinelerin herhangi biri için şu söylenebilir: Bir Horner’lık çıktı için beş yıl beklemek gerekmez.
Joe için çok az beceri varsaydım; Oracle ve LARC için daha da azı geçerlidir. Çözülecek bir diferansiyel denklemimiz varsa, ister Joe tarafından, ister Oracle ya da LARC tarafından olsun, düzgün biçimde programlanmalıdır; çünkü bu üçünden hiçbiri aritmetik dışında herhangi bir matematik bilmez. Diyelim ki problem yaklaşık bir Horner’lık hesaplama gerektiriyor.
Problemlerin Çözümü
LARC için problemlerin programlanmasını Joe için yapılan programlamayla karşılaştırmak için, Joe’ya verilerinin ve talimatlarının en başta verildiğini ve ardından beş yıl boyunca onunla tüm iletişimin kesildiğini varsaymalıyız; bu sürenin sonunda aniden ortaya çıkar ve doğru olup olmayabilecek cevaplarla gelir. Talimatlar, tüm olasılıkları yönlendirecek kadar açık olmalıdır; çünkü varsayım gereği bu süre boyunca tüm iletişim kesilmiştir.
Gerçek hesaplamalarda fiilen kullanılan sayıların dağılımının basit olmaktan çok uzak olduğu açıktır. Örneğin, basit rasyoneller, e ve π gibi bazı aşkın sayılar ve bunların basit fonksiyonları, rastgeleliğin çok üzerinde bir sıklıkla ortaya çıkar. Bu konuda yakın zamanda kötümser bir varsayım formüle etmişken, İskoç bir matematikçi tarafından ilkemin İskoçya’da Macpherson Yasası adıyla zaten iyi bilindiği söylendi. Orijinal İskoçça ifadesi şöyledir: “Macpherson's piece aye fa's jeelie side doon”. Aynı ilkenin das Gesetz der Schweinerei der Natur olarak bilinen başka bir ifadesi daha vardır.
Benzerlik kusursuz değildir; çünkü Oracle ya da LARC basitçe durabilir. En azından, öngörülebilir nitelikte şüpheler ortaya çıktığında duracak şekilde programlanabilir. Ancak çoğu zaman sorunlar öngörülebilir olsa bile öngörülmez ve makine, sapma fark edilene kadar gayretle anlamsız sonuçlar üretir. Neyse ki LARC’ın 50 sentlik Horner’larından birkaçını israf etmeyi göze alabiliriz; Joe’nun 25.000 dolarlık Horner’larını ise göze alamazdık. Ancak bu gerçek, zorluğu hafifletse de ortadan kaldırmaz.
Sonuçta, herhangi bir problem için, bilgisayarı en azından birkaç saniye boyunca kesintisiz ve geçerli bir biçimde yönlendirebilecek bir programa ulaşmak gerekir; LARC söz konusu olduğunda bu, Joe’nun neredeyse o kadar yıl çalışmasına eşdeğer olurdu. LARC bir Horner üretmek için 8 saniye gerektirirken, üç ya da dört yıl içinde Horner başına saniyede bir ya da daha fazlasını üretecek makineler ufukta görünmektedir.
Bu rakamlar, bu bilgisayarların ne kadar şaşırtıcı başarılar olduğunu göstermek için değil, Joe’nun yardımıyla bir problemi çözmek ile LARC’ın yardımıyla çözmek arasındaki farkı vurgulamak için sunulmaktadır. Friden ve Marchant makinelerini gerçekten kullanan, kanlı canlı Joe’lar genellikle hapsedilmiş değildir ve aslında çoğu zaman, LARC’ın yapamayacağı şekilde, işlerin ne zaman ters gittiğini kendileri görebilirler. Özellikle, el ile yapılan bir hesaplama sırasında yuvarlama hatalarının birikimi çoğu zaman gözlemlenebilir ve düzeltici önlemler alınabilir.
Bir ya da iki Horner’lık bir hesaplama süreci boyunca yuvarlama hatalarının çok ciddi biçimde birikebileceği ve tüm sonucu geçersiz kılabileceği söylemeye bile gerek yoktur. Belirli türden hesaplamalar sırasında üretilen hataların istatistiksel dağılımlarını türetmeye çalışan bazı makaleler yayımlanmıştır, ancak genel olarak bu sonuçlara kuşkuyla yaklaşıyorum. Bu tür kestirimler için, başlangıçtaki veri ve hata dağılımlarında belli bir tekdüzelik varsayımının yapılması gerekir.
Bunu, birkaç yıl önce kayan nokta yordamının sabit nokta bir makine için hazırlanması sırasında yaşanan bir olayla açıklayabilirim. Sonuçlar bazı açık fakat şaşırtıcı tutarsızlıklar gösteriyordu; ancak sonunda, sağlanan 2²⁰ olası sayı çiftinden biri hariç tümü için yordamın doğru çarpımı verdiği ve bu tek çiftin gerçekten de hesaplama sırasında ortaya çıktığı bulundu. Bu çiftin herhangi bir anda ortaya çıkma olasılığı, elbette, tekdüze dağılım varsayımı altında 2⁻²⁰, yani yaklaşık 10⁻⁶ idi.
Yakın zamanda ORNL’de, matrislerin tersini alma için bir yordam, tersi analitik olarak elde edilebilen belirli bir matrise uygulanarak sınanıyordu. Hesaplanan bir ters, özgün matrisle çarpılıp sonuç birim matristen çıkarıldığında, bu tersin bireysel elemanlarındaki hataya oldukça kolay ve kesin biçimde bir üst sınır hesaplamak mümkündür. Bu olayda, hesaplanan üst sınır, bazı elemanlarda gerçekten bulunan hatalar tarafından birkaç mertebe aşılmıştı. Tutarsızlığın, özgün matrisin elemanlarını ondalık biçimden ikili biçime dönüştürürken yapılan küçük artık hatadan kaynaklandığı ortaya çıktı. Başka bir deyişle, gerçekten tersine alınan matris, teorik olarak tersi bilinen matristen son birkaç ikili basamakta farklıydı ve bu da tutarsızlığı açıklıyordu.
Bilimsel hesaplamalar için ondalık makinelerin ve kayan nokta makinelerinin giderek artan popülerliğinden hafifçe rahatsızlık duyuyorum. Olası tüm tabanlar arasında, üretilen hatanın büyüme hızını en aza indirenin taban 2 olduğu bir teoremdir. Aslında, taban büyüdükçe hız da artar. Kayan noktaya itirazım, bildiğim kadarıyla, kayan nokta aritmetiği kullanıldığında üretilen hatanın büyüme hızının nasıl öngörüleceğini kimsenin bilmemesine dayanmaktadır.
Üretilen hatadan söz ederken, elbette makinenin arızalanmasından, hatalı kodlamadan ya da yanlış bir formülün kullanılmasından söz etmiyorum. Bunlar görece kolay saptanır ve düzeltilir. Hatta kesme (truncation) hatalarını bile kastetmiyorum. Bunlar da genellikle oldukça kolay saptanır; gerçi Taylor serisinin çok erken kesilmesi nedeniyle birkaç aylık IBM hesaplamalarının geçersiz bulunduğu bir olayı ve belirli bir serinin kullanılabilir olacak kadar hızlı yakınsamadığı anlaşıldığı için birkaç aylık kodlama süresinin ve bir miktar makine zamanının boşa harcandığı başka bir olayı biliyorum. Bu iki durumda da, yeterli miktarda oldukça standart matematiksel analiz, kaybı önleyebilirdi.
Ancak burada sözünü ettiğim hatalar, her çarpma ve bölmeden sonra yapılan yuvarlamadan kaynaklananlardır ve kayan nokta işlemlerinde, toplama ya da çıkarma öncesinde üsler kaydırılarak ayarlandığında da ortaya çıkarlar. Bu durumdaki analiz her zaman zahmetlidir ve matematiksel teknikler hiç de iyi gelişmiş değildir.
Bazı durumlarda hatanın a posteriori kestirimleri yapılabilir. Bir matrisin hesaplanan tersindeki hataya bir üst sınır elde etme formülünden zaten söz etmiştim; ancak hatırlayacağınız gibi, bu makinedeki gerçek matrise ilişkindir ve bu matris her zaman tam olarak—hatta nadiren tam olarak—tersini almak istediğiniz matris değildir.
Bildiğim kadarıyla, bir doğrusal denklem sisteminin çözümündeki hatalar için, hesaplanmış bir tersi kullanmadan genel olarak kesin bir sınır elde etmenin bir yolu yoktur. Hesaplanan çözümü özgün denklemlere yerine koymak yeterli değildir. Diyelim ki bunu yaptınız ve yuvarlama hataları sınırları içinde denklemlerin tam olarak sağlandığını bile buldunuz. Yani Ax = b çözmek istiyorsunuz ve x için, makine çarpımı (Ax*)* alındığında tam olarak b elde edilen bir x* vektörü buldunuz. Buna rağmen, genel olarak gerçek çarpım Ax* istenen b vektöründen, her bir elemanının makine hesaplamasında üretilen azami hatayı aşmadığını bildiğiniz bir d vektörü kadar farklı olacaktır.
O halde hata x − x* = A⁻¹d’dir. Şimdi, eğer bu bilinmeyen d vektörünün, A’nın en küçük özdeğerine karşılık gelen özvektör yönünde büyük bir bileşeni varsa—bu özdeğere λ diyelim—o zaman gerçek hata vektörü x − x* yaklaşık olarak λ⁻¹d olacaktır ve λ küçükse, A⁻¹d’nin elemanları büyük olabilir. Bu, sözde kötü koşullu (ill-conditioned) sistemlerde meydana gelebilecek durumdur. Ancak durum daha da kötü olabilir.
Şu biçimi ele alalım
A = I − αJ,
yerinde J, köşegenin hemen altındaki elemanları bir, diğer her yerde sıfır olan bir matristir. O halde
A⁻¹ = I + αJ + α²J² + ··· + αⁿ⁻¹Jⁿ⁻¹.
Dolayısıyla, A için her özdeğer λ = 1 olmasına karşın, x − x*’nin son elemanı d’nin ilk elemanının αⁿ⁻¹ katı olacaktır. α büyük ve n büyükse, büyütme çok büyük olacaktır.
Bu olgu, diferansiyel denklemlerin sonlu fark çözümünde iyi bilinir. İstikrarsızlık adıyla anılır. Aslında, başkalarının da belirttiği gibi, istikrarsızlık bir derece meselesidir ve bu şekilde ele alınmalıdır.
Diferansiyel denklem, ister adi ister kısmi olsun, doğrusal ise, bilinmeyenlerin x vektörünün elemanları, ağın düğüm noktalarındaki bağımlı değişken değerleridir; b vektörünün elemanları sınır ya da başlangıç değerleri tarafından belirlenir; A matrisinin elemanları ise türevlerin sonlu farklarla yaklaştırılma yöntemine bağlıdır.
Başlangıç değer problemleri için genellikle, bağımlı değişkenin bir sınır ya da köşe noktasından başlayıp noktadan noktaya ilerleyen basit bir özyineleme ile değerlendirilebildiği bir düzen kurmaya çalışılır. Genellikle matrisi açıkça yazmazsınız, hatta belki problemi bu terimlerle düşünmezsiniz bile; fakat gerçekte A matrisi, sıfır olmayan tüm elemanları köşegen üzerinde ya da onun hemen altında yer alan bir üçgensel matristir. Biçimi, az önce gösterilen matristen yalnızca biraz daha karmaşıktır.
Şimdi matrisin mertebesi ağın inceliğine bağlıdır. Genel olarak αⁿ⁻¹, βⁿ⁻¹, … biçiminde terimlerin doğrusal bir birleşimi bulunacaktır; burada α ve β, ağ aralığının kendilerinin fonksiyonlarıdır. Kesme hatasını azaltmak için arzu edildiği üzere n büyütülürse, genel olarak terimlerden en az biri, αⁿ⁻¹, βⁿ⁻¹, …, büyük hale gelir. Bu nedenle, n ile büyümenin mümkün olduğunca yavaş olduğu bir biçim elde edilmeye çalışılır. Ancak bu yönde yapılabileceklerin de sınırları vardır.
Öte yandan, A matrisinin üçgensel olması gerekmiyorsa, bu tür bir birikimden kaçınılabilir. Denklemlerin çözümü, A üçgensel olduğundaki kadar kolay değildir, ancak LARC üzerinde Horner’lar ucuzdur, Oracle üzerinde de oldukça makuldür ve zahmete değebilir. Üçgensel olmayan bir düzen örtük (implicit) olarak adlandırılır. Sınır değer problemleri için seçenek yoktur ve örtük bir düzen kullanmak zorunludur.
Problemlerin Çözümü (devam)
Örtük düzenlerle, ister sınır değer problemleri ister başka türler için olsun, genellikle yinelemeli bir çözüm yöntemi tercih edilir. Bunun nedeni kısmen, matrisin genellikle çok büyük ama yapısının basit olması, buna karşılık tersinin büyük ve karmaşık olmasıdır. Çok sayıda yineleme gerekebilse de, her biri görece basittir ve kolayca programlanır. Ayrıca, yineleme tam yakınsama sağlanıncaya kadar sürdürülürse, hesaplanan çözümün gerçek çözümden sapması x − x* olabildiğince küçük olur; oysa doğrudan bir çözümün sonucu, sonradan yinelemeli bir tekniğin uygulanmasıyla daha da iyileştirilmek zorunda kalabilir.
Reaktör kritiklik hesaplamaları için, en azından tek boyutta, doğrudan çözüm aşağıdaki durum nedeniyle oldukça basittir. A matrisi, sıfır olmayan elemanları ana köşegen üzerinde, hemen altında ve hemen üstünde bulunan sözde bir devamlı (continuant) matristir. Böyle bir matris, biri yalnızca ana köşegen üzerinde ve hemen altında sıfır olmayan elemanlara sahip, diğeri ise yalnızca ana köşegen üzerinde ve üstünde bu elemanlara sahip iki matrisin çarpımı olarak ayrıştırılabilir. Köşegenlerden biri birlerden oluşacak şekilde alınabilir ve basit bir özyineleme kümesi diğer 3n − 2 elemanı verir. Her bir çarpan matris de sırayla kolayca tersine alınır. Bu, kritiklik hesaplamalarında yaygın olarak kullanılan “out-in” ya da “in-out” algoritmasının temelidir.
Şimdi iki boyutlu problem için matris, şu şekilde oluşturulan bir bileşik matristir. Yukarıdaki A matrisinde, her köşegen elemanı A ile aynı biçimde bir matrisle değiştirin; kalan sıfır olmayan her elemanı ise köşegen bir matrisle değiştirin. Bu matris, özyineleme ilişkilerinin matrisler içerdiği ve dolayısıyla çarpanların sırasının önemli olduğu göz önünde bulundurulursa, yukarıdaki matrisle tamamen aynı biçimde ayrıştırılabilir ve tersine alınabilir.
Üç boyutlu problem için, bu bileşik matrislerden bir üst bileşik matris oluşturmak gerekir, ancak algoritma yine geçerlidir. Bildiğim kadarıyla, gereken Horner sayısı tahmin edildiğinde açık olan nedenlerden dolayı, bu mevcut makineler için hiç programlanmamıştır.
Gerçekte, genel bir matrisi tersine almak ya da ikisini çarpmak, mertebenin küpüyle orantılı sayıda çarpma gerektirir; oysa bu özel matrisler için bu sayı kare ile sınırlı tutulabilir. Her yönde 60 noktadan oluşan bir ağ düşünürsek, bu 10⁵, yani bir Horner eder; buna bir sabit katsayı çarpanı eklenir. Bu sayı grup sayısıyla tekrar çarpılmalı ve ayrıca gerekebilecek yineleme sayısıyla bir kez daha çarpılmalıdır.
Hepimiz lisede eşzamanlı doğrusal denklemleri çözmeyi öğrendik; yine de günümüz sayısal analistleri için en yaygın ve en kaçamak sorunlardan biri, bunu Oracle’lar, NORC’lar ve LARC’lar üzerinde verimli biçimde nasıl yapacaklarıdır. Mertebesi 100 olan genel bir matrisin tersinin alınması, çok sayıdaki aktarım işlemi de hesaba katıldığında, birkaç saatlik hesaplama gerektirir; kısmi diferansiyel denklemlerden geldiklerinde ise 100 küçük bir sayıdır.
Öncelikle yalnızca çarpımların ezici sayısı vardır, ancak sorun bununla sınırlı değildir. Büyük matrisler için iç depolamanın kapasitesi aşılır ve bilginin bununla yardımcı depolama arasında aktarılması gerekir. Ancak en kritik olan, küçük bölenlerin ortaya çıkabilmesi ve üretilen hataları, sonraki hesaplamaları geçersiz kılacak bir ölçeğe kadar büyütebilmesidir.
Matris özünde kötü koşullu değilse, bundan kaçınmanın bir yolu “boyuta göre konumlandırma”dır; bu, en büyük katsayının bulunması ve onu içeren denklemin, elemenin her aşamasında ilk konuma kaydırılması anlamına gelir. Bu, makine için çok zaman alıcıdır; gerçek bir yer değiştirmeden kaçınmak için kullanılan eşdeğer mantıksal işlemler de öyledir. Ancak bakış açısında yapılacak küçük bir değişiklik, zorluğu tamamen bertaraf eden biraz farklı bir yaklaşım önerir; daha fazla gerçek çarpma gerektirse de, karıştırma işlemlerinde büyük bir azalma sağlar. Yordam, elemenin bir düzlem dönmeleri dizisi gerçekleştirilerek yapılmasıdır.
Bu yöntem üretilen hatayı azaltır, yan ürün olarak determinantın değerini verir ve herhangi bir sütundaki elemanların kareleri toplamının değişmez kalması sayesinde sürekli bir denetim olanağı sağlar. Yöntem ORNL’de J. W. Givens tarafından geliştirilmiştir ve şu anda Oracle üzerinde son derece etkili biçimde kullanılmaktadır. Bant işlemleri de dahil olmak üzere, mertebesi 100 olan bir matrisin tersinin alınması yaklaşık 10 saat gerektirir.
Saat başına maliyetleri hesaplarken matematikçi ve programcı maaşlarını dahil etmedim. Bunun, örneğin LARC için Joe’ya kıyasla çok daha yüksek olduğu sıklıkla düşünülür. Saatlik bazda bu kesinlikle doğrudur, ancak saat başına çıktı bazında hiç de öyle değildir. Matematik eğitimi olmayan bir grup Joe’yu ele alalım. Bir profesyonelden ne kadar gözetim ve programlama gerektirecekleri birçok etkene bağlıdır, ancak denetçi başına on Joe üst sınıra yakın görünür. On Joe yılda iki saat üretebilir ve dolayısıyla iki saat için bir profesyonel insan-yılı gerekir. On saat, Oracle üzerinde yaklaşık 16 dakika, LARC üzerinde ise yaklaşık 16 saniyedir. Oracle’da bir saatlik çalışma süresi yaklaşık 8 saat ya da 4 profesyonel insan-yılı eder. Bir saatlik çalışma için iki yıl programlama ve kodlama gerektiren bir makine sorununu henüz görmedim.
Daha da önemlisi, Oracle ya da LARC için yazılmış bir kodun bir sermaye yatırımı olmasıdır.
(Doğrusal denklem — s. 15’te devam ediyor)
HESAPLAŞMA GÜNÜ
(s. 9’dan devam)
Az önce tanımladığım çözücü, yapımı için bir adam-yıldan oldukça az bir süre gerektirmiştir. Yapımına yönelik doğrudan itici güç, mertebesi 190 olan bir matrisin tersinin alınması gereksinimiydi. Bu matrisin tersi alınmış olup, aynı matrise sahip çok sayıda sistemin çözümünü elde etmek için kullanılmış ve kullanılmaya devam edilecektir.
Kod, diğer matrislere sahip başka sistemleri çözmek için de kesinlikle birçok kez kullanılacaktır ve bir kez geliştirilmiş olduğundan, Oracle mevcut biçimiyle varlığını sürdürdüğü sürece kod kullanıma hazır kalacaktır. Benzer yorumlar, birden fazla kez kullanılacağı düşünülmeden yapılmış olanlar dâhil olmak üzere, sayısız başka kod için de yapılabilir. Müşterilerin, aynı şeyden daha fazlasına ihtiyaç duyduklarını fark etme gibi bir özellikleri vardır.
Horner ile bir yararlılık ölçüsünü ilişkilendirmek için hiçbir çaba göstermediğimi bir kez daha vurgulamak isterim. Öncelikle bu, makineden makineye farklılık gösterir; çünkü bir makinede tek bir Horner problemi olan şey, başka bir makinede belki de 10 kadar Horner olabilir. Ayrıca, problemin baştan yapılmasına gerek olmamış olması her zaman mümkündür. Fizikçiler, Horners’ın başlıca tüketicileri ve potansiyel tüketicileri arasındadır ve aralarındaki talep büyüktür. Dolayısıyla, bunların bedeline değdiğini kabul ederseniz, bence bir şey açıktır. Hesaplama makinesinde hepimiz Macpherson’ız. Bu nedenle, jöleyi kurtarmak istiyorsak, parçanın düşmesini önlemek için biraz dikkat göstermemiz gerekir.