Karatsuba algorithm C++ implementation

来源:互联网 发布:sql团体培训 编辑:程序博客网 时间:2024/05/21 21:49
////  main.cpp//  multiply////  Created by Longxiang Lyu on 5/23/16.//  Copyright (c) 2016 Leo Lyu. All rights reserved.//// the karatsuba's algorithm only needs O(n^log3) bit operation to do the// multiplication of two integers, which is better than O(n^2) solutions#include <iostream>#include <string>using namespace std;size_t equalizeLength(string &s1, string &s2){    size_t len1 = s1.size(), len2 = s2.size();    if (len1 < len2)    {        for (int i = 0; i < len2 - len1; ++i)            s1 = '0' + s1;        return len2;    }    else if (len1 > len2)    {        for (int i = 0; i < len1 - len2; ++i)            s2 = '0' + s2;    }    return len1;}string strAddition(string s1, string s2){    string ret;    int carry = 0;    size_t len = equalizeLength(s1, s2);        for (int i = len - 1; i >= 0; --i)    {        int firstBit = s1.at(i) - '0';        int secondBit = s2.at(i) - '0';                int sum = (firstBit ^ secondBit ^ carry) + '0';        ret = static_cast<char>(sum) + ret;                carry = (firstBit & secondBit) | (firstBit & carry) | (secondBit & carry);    }    if (carry)        ret = '1' + ret;    return ret;}long int Karatsuba_multiply(string s1, string s2){    size_t len = equalizeLength(s1, s2);        // base case    if (len == 0) return 0;    if (len == 1) return (s1[0] - '0') * (s2[0] - '0');        size_t floor = len / 2;    size_t ceil = len - floor;    string a = s1.substr(0, floor);    string b = s1.substr(floor, ceil);    string c = s2.substr(0, floor);    string d = s2.substr(floor, ceil);    long int p1 = Karatsuba_multiply(a, c);    long int p2 = Karatsuba_multiply(b, d);    long int p3 = Karatsuba_multiply(strAddition(a, b), strAddition(c, d));        return (1<<(2 * ceil)) * p1 + (1<<(ceil)) * (p3 - p1 - p2) + p2;}int main(int argc, const char * argv[]) {    string s1 = "10101010";    string s2 = "111101";    cout << s1 << " multiplies " << s2 << " is " << Karatsuba_multiply(s1, s2) << endl;    return 0;}

Reference:

https://en.wikipedia.org/wiki/Karatsuba_algorithm

http://www.geeksforgeeks.org/divide-and-conquer-set-2-karatsuba-algorithm-for-fast-multiplication/

http://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/05DivideAndConquerII.pdf

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上眼皮又痒又肿怎么办 上眼皮红肿痛是怎么办 上眼皮肿的厉害怎么办 眼皮肿了还痒痒怎么办 眼睛被手指戳到怎么办 打球眼睛撞肿了怎么办 打球时眼睛被戳怎么办 狗眼睛被打充血怎么办 一只眼睛磨的慌怎么办 5个月宝宝结膜炎怎么办 金毛眼屎多白色怎么办 金毛眼红有眼屎怎么办 狗狗眼睛上火了怎么办 狗上火了眼屎多怎么办 金毛走路扭腰怎么办 金毛流鼻涕微黄怎么办 狗狗下眼皮红了怎么办 金毛眼睛打肿了怎么办 金毛的眼睛红怎么办 眼睛干涩有红血丝怎么办 小孩子眼睛红有眼屎怎么办 狗狗的肉垫粗糙怎么办 狗狗眼睛变蓝色怎么办 脸被太阳晒伤了怎么办 皮肤晒伤红肿痒怎么办 3岁儿童频繁眨眼怎么办 狗狗的眼睛红肿怎么办 脸过敏发红怎么办不痒 上眼皮红肿痒是怎么办 眼睛痒了几天了怎么办 眼睛肿了还痒怎么办 孩子脸上有红血丝怎么办 脸上长了红血丝怎么办 指甲受创出血了怎么办 手指被挤压紫了怎么办 眼睛撞了有淤血怎么办 下眼底有小白点怎么办 狗的白眼球充血怎么办 眼球有出血点是怎么办 吃阿胶上火了该怎么办 胎儿胼胝体发育不良怎么办