-- $NetBSD: happy.lua,v 1.1 2017/04/15 04:27:30 kamil Exp $ -- -- Copyright (c) 2015 The NetBSD Foundation, Inc. -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS -- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS -- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -- POSSIBILITY OF SUCH DAMAGE. -- -- -- Commentary: -- A happy number is a number defined by the following process: Starting with -- any positive integer, replace the number by the sum of the squares of its -- digits, and repeat the process until the number equals 1 (where it will -- stay), or it loops endlessly in a cycle which does not include 1. Those -- numbers for which this process ends in 1 are happy numbers, while those that -- do not end in 1 are unhappy numbers (or sad numbers). -- -- For more information on happy numbers, and the algorithms, see -- http://en.wikipedia.org/wiki/Happy_number -- -- The happy number generator is here only to have something that the user -- can read from our device. Any other arbitrary data generator could -- have been used. The algorithm is not critical to the implementation -- of the module. local HAPPY_NUMBER = 1 -- If n is not happy then its sequence ends in the cycle: -- 4, 16, 37, 58, 89, 145, 42, 20, 4, ... local SAD_NUMBER = 4 -- This following algorithm is designed for numbers of the integer type. -- Integer numbers are used by default in the NetBSD kernel, as there would be -- need for additional overhead in context-switch with support for floats. function dsum(n) local sum = 0 while n > 0 do local x = n % 10 sum = sum + (x * x) n = n / 10 end return sum end function is_happy(n) while true do local total = dsum(n) if total == HAPPY_NUMBER then return 1 end if total == SAD_NUMBER then return 0 end n = total end end |