源代码-Q学习算法怎样用C++代码实现呢??

问题描述

Q学习算法怎样用C++代码实现呢??

Q学习算法怎样用C++代码实现呢??可以执行的源代码,,谢谢了,,技术小白

解决方案

RSA算法介绍及JAVA实现,其实java和c++差不多,参考一下吧

<一>基础

RSA算法非常简单,概述如下:
找两素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)
取d*e%t==1

这样最终得到三个数: n d e

设消息为数M (M <n)
设c=(M**d)%n就得到了加密后的消息c
设m=(c**e)%n则 m == M,从而完成对c的解密。
注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:
n d两个数构成公钥,可以告诉别人;
n e两个数构成私钥,e自己保留,不让任何人知道。
给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。
别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解
从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法
求得d。

<二>实践

接下来我们来一个实践,看看实际的操作:
找两个素数:
p=47
q=59
这样
n=p*q=2773
t=(p-1)*(q-1)=2668
取e=63,满足e
用perl简单穷举可以获得满主 e*d%t ==1的数d:
C:Temp>perl -e "foreach $i (1..9999){ print($i),last if $i*63%2668==1 }"
847
即d=847

最终我们获得关键的
n=2773
d=847
e=63

取消息M=244我们看看

加密:

c=M**d%n = 244**847%2773
用perl的大数计算来算一下:
C:Temp>perl -Mbigint -e "print 244**847%2773"
465
即用d对M加密后获得加密信息c=465

解密:

我们可以用e来对加密后的c进行解密,还原M:
m=c**e%n=465**63%2773 :
C:Temp>perl -Mbigint -e "print 465**63%2773"
244
即用e对c解密后获得m=244 , 该值和原始信息M相等。

<三>字符串加密

把上面的过程集成一下我们就能实现一个对字符串加密解密的示例了。
每次取字符串中的一个字符的ascii值作为M进行计算,其输出为加密后16进制
的数的字符串形式,按3字节表示,如01F

代码如下:

#!/usr/bin/perl -w
#RSA 计算过程学习程序编写的测试程序
#watercloud 2003-8-12
#
use strict;
use Math::BigInt;

my %RSA_CORE = (n=>2773,e=>63,d=>847); #p=47,q=59

my $N=new Math::BigInt($RSA_CORE{n});
my $E=new Math::BigInt($RSA_CORE{e});
my $D=new Math::BigInt($RSA_CORE{d});

print "N=$N D=$D E=$En";

sub RSA_ENCRYPT
{
my $r_mess = shift @_;
my ($c,$i,$M,$C,$cmess);

for($i=0;$i < length($$r_mess);$i++)
{
$c=ord(substr($$r_mess,$i,1));
$M=Math::BigInt->new($c);
$C=$M->copy(); $C->bmodpow($D,$N);
$c=sprintf "%03X",$C;
$cmess.=$c;
}
return $cmess;
}

sub RSA_DECRYPT
{
my $r_mess = shift @_;
my ($c,$i,$M,$C,$dmess);

for($i=0;$i < length($$r_mess);$i+=3)
{
$c=substr($$r_mess,$i,3);
$c=hex($c);
$M=Math::BigInt->new($c);
$C=$M->copy(); $C->bmodpow($E,$N);
$c=chr($C);
$dmess.=$c;
}
return $dmess;
}

my $mess="RSA 娃哈哈哈~~~";
$mess=$ARGV[0] if @ARGV >= 1;
print "原始串:",$mess,"n";

my $r_cmess = RSA_ENCRYPT($mess);
print "加密串:",$$r_cmess,"n";

my $r_dmess = RSA_DECRYPT($r_cmess);
print "解密串:",$$r_dmess,"n";

#EOF

测试一下:
C:Temp>perl rsa-test.pl
N=2773 D=847 E=63
原始串:RSA 娃哈哈哈~~~
加密串:5CB6CD6BC58A7709470AA74A0AA74A0AA74A6C70A46C70A46C70A4
解密串:RSA 娃哈哈哈~~~

C:Temp>perl rsa-test.pl 安全焦点(xfocus)
N=2773 D=847 E=63
原始串:安全焦点(xfocus)
加密串:3393EC12F0A466E0AA9510D025D7BA0712DC3379F47D51C325D67B
解密串:安全焦点(xfocus)

<四>提高

前面已经提到,rsa的安全来源于n足够大,我们测试中使用的n是非常小的,根本不能保障安全性,
我们可以通过RSAKit、RSATool之类的工具获得足够大的N 及D E。
通过工具,我们获得1024位的N及D E来测试一下:

n=0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005D
BDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B
47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2
BC511951

d=0x10001

e=0xE760A3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C2995
4C5D86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF2
C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B
1965

设原始信息
M=0x11111111111122222222222233333333333

完成这么大数字的计算依赖于大数运算库,用perl来运算非常简单:

A) 用d对M进行加密如下:
c=M**d%n :
C:Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x11111111111122222222222233
333333333, 0x10001, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5F
CD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F0
17F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD6
0438941D2ED173CCA50E114705D7E2BC511951);print $x->as_hex"
0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd
45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b
3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91
f1834580c3f6d90898

即用d对M加密后信息为:
c=0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd
45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b
3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91
f1834580c3f6d90898

B) 用e对c进行解密如下:

m=c**e%n :
C:Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x17b287be418c69ecd7c39227ab
681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3
866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb4764414
65f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898, 0xE760A
3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D
86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF
2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A
592D2B1965, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90
B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF
1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941
D2ED173CCA50E114705D7E2BC511951);print $x->as_hex"
0x11111111111122222222222233333333333
(我的P4 1.6G的机器上计算了约5秒钟)

得到用e解密后的m=0x11111111111122222222222233333333333 == M

C) RSA通常的实现
RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密,
最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用
RSA对刚才的加密密钥进行加密。

最后需要说明的是,当前小于1024位的N已经被证明是不安全的
自己使用中不要使用小于1024位的RSA,最好使用2048位的。


一个简单的RSA算法实现JAVA源代码:

filename:RSA.java

/*

  • Created on Mar 3, 2005
    *
  • TODO To change the template for this generated file go to
  • Window - Preferences - Java - Code Style - Code Templates
    */

import java.math.BigInteger;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;

/**

  • @author Steve
    *
  • TODO To change the template for this generated type comment go to
  • Window - Preferences - Java - Code Style - Code Templates
    */
    public class RSA {

    /**

    • BigInteger.ZERO
      */
      private static final BigInteger ZERO = BigInteger.ZERO;

    /**

    • BigInteger.ONE
      */
      private static final BigInteger ONE = BigInteger.ONE;

    /**

    • Pseudo BigInteger.TWO
      */
      private static final BigInteger TWO = new BigInteger("2");

    private BigInteger myKey;

    private BigInteger myMod;

    private int blockSize;

    public RSA (BigInteger key, BigInteger n, int b) {
    myKey = key;
    myMod = n;
    blockSize = b;
    }

    public void encodeFile (String filename) {
    byte[] bytes = new byte[blockSize / 8 + 1];
    byte[] temp;
    int tempLen;
    InputStream is = null;
    FileWriter writer = null;
    try {
    is = new FileInputStream(filename);
    writer = new FileWriter(filename + ".enc");
    }
    catch (FileNotFoundException e1){
    System.out.println("File not found: " + filename);
    }
    catch (IOException e1){
    System.out.println("File not found: " + filename + ".enc");
    }

    /**

    • Write encoded message to 'filename'.enc
      */
      try {
      while ((tempLen = is.read(bytes, 1, blockSize / 8)) > 0) {
      for (int i = tempLen + 1; i < bytes.length; ++i) {
      bytes[i] = 0;
      }
      writer.write(encodeDecode(new BigInteger(bytes)) + " ");
      }
      }
      catch (IOException e1) {
      System.out.println("error writing to file");
      }

    /**

    • Close input stream and file writer
      */
      try {
      is.close();
      writer.close();
      }
      catch (IOException e1) {
      System.out.println("Error closing file.");
      }
      }

    public void decodeFile (String filename) {

    FileReader reader = null;
    OutputStream os = null;
    try {
    reader = new FileReader(filename);
    os = new FileOutputStream(filename.replaceAll(".enc", ".dec"));
    }
    catch (FileNotFoundException e1) {
    if (reader == null)
    System.out.println("File not found: " + filename);
    else
    System.out.println("File not found: " + filename.replaceAll(".enc", "dec"));
    }

    BufferedReader br = new BufferedReader(reader);
    int offset;
    byte[] temp, toFile;
    StringTokenizer st = null;
    try {
    while (br.ready()) {
    st = new StringTokenizer(br.readLine());
    while (st.hasMoreTokens()){
    toFile = encodeDecode(new BigInteger(st.nextToken())).toByteArray();
    System.out.println(toFile.length + " x " + (blockSize / 8));

    if (toFile[0] == 0 && toFile.length != (blockSize / 8)) {
    temp = new byte[blockSize / 8];
    offset = temp.length - toFile.length;
    for (int i = toFile.length - 1; (i <= 0) && ((i + offset) <= 0); --i) {
    temp[i + offset] = toFile[i];
    }
    toFile = temp;
    }

    /*if (toFile.length != ((blockSize / 8) + 1)){
    temp = new byte[(blockSize / 8) + 1];
    System.out.println(toFile.length + " x " + temp.length);
    for (int i = 1; i < temp.length; i++) {
    temp[i] = toFile[i - 1];
    }
    toFile = temp;
    }
    else
    System.out.println(toFile.length + " " + ((blockSize / 8) + 1));*/
    os.write(toFile);
    }
    }
    }
    catch (IOException e1) {
    System.out.println("Something went wrong");
    }

    /**

    • close data streams
      */
      try {
      os.close();
      reader.close();
      }
      catch (IOException e1) {
      System.out.println("Error closing file.");
      }
      }

    /**

    • Performs base^pow within the modular
    • domain of mod.
      *
    • @param base the base to be raised
    • @param pow the power to which the base will be raisded
    • @param mod the modular domain over which to perform this operation
    • @return base^pow within the modular
    • domain of mod.
      */
      public BigInteger encodeDecode(BigInteger base) {
      BigInteger a = ONE;
      BigInteger s = base;
      BigInteger n = myKey;

    while (!n.equals(ZERO)) {
    if(!n.mod(TWO).equals(ZERO))
    a = a.multiply(s).mod(myMod);

    s = s.pow(2).mod(myMod);
    n = n.divide(TWO);
    }

    return a;
    }

}

解决方案二:

可以参考: http://download.csdn.net/download/royafly/2930417,再查找一下,应该就有你想要的。

解决方案三:

也是学c语言的但是不会

解决方案四:

同问,求大神解答!c是很有用的语言,接近底层,效率高。

时间: 2024-09-07 13:30:13

源代码-Q学习算法怎样用C++代码实现呢??的相关文章

《中国人工智能学会通讯》——2.18 深度学习算法的计算与访存特征

2.18 深度学习算法的计算与访存特征 图 1 是一个用于手写识别的深度卷积神经元网络 LeNet5 [6] ,以此为例讨论深度学习算法的计算特征.在 LeNet5 中,包括了卷积层 C1.C3.C5 和Subsampling 层 S2.S4,以及全连接层 F6.其中卷积层是最为费时的操作. 对 于 有 R 个 输 入 feature map 和 Q 个 输 出feature map 的卷积层,假设 feature map 的大小为 M×N,卷积核的大小为 K×L,则该卷积层的代码大致可以表示为

从Caffe开始深度学习实战,徒手hack代码乐趣更多

从Geoffrey Hinton 2006年的论文算起,这一波深度学习(DL)浪潮才10年,而如果只算国内,深度学习的流行也不过5年,尽管如此,深度学习现在已经扎根中国互联网,成为BAT.京东.360.今日头条等公司的基础技术和战略技术,与之伴随的,则是深度学习技术人员的快速成长,例如,阿里云工程师卜居(赵永科)博客,2014年才开始接触深度学习实战,如今已在深度学习及计算优化方面方面有很独到的见解.卜居在最近写了一本浓缩其深度学习实战经验的书--<深度学习-21天实战Caffe>,该书获得了

嵌入式 十个最值得阅读学习的C开源项目代码

开源世界有许多优秀的开源项目,我选取其中十个最优秀的.最轻量级的C语言的项目,希望可以为C语言开发人员提供参考. 十个最值得阅读学习的C开源项目代码 1. Webbench 2. Tinyhttpd 3. cJSON 4. CMockery 5. Libev 6. Memcached 7. Lua 8. SQLite 9. UNIX v6 10. NETBSD 十个最值得阅读学习的C开源项目代码 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fo

TensorFlow Agents日前开源,轻松在TF中构建并行强化学习算法

用于在TensorFlow中构建并行强化学习算法的高效基础架构范例TensorFlow Agents日前开源,这个项目是由谷歌的两位研究员James Davidson.Vincent Vanhoucke,以及Danijar Hafner共同研发的.关于这个项目的开源信息他们在GitHub上进行了介绍,雷锋网 AI 科技评论将内容进行编译整理. TensorFlow Agents TensorFlow Agents为强化学习提供了优化的基础架构,它将OpenAI gym接口扩展到多个并行环境,并能

阅读android项目源代码对学习android开发帮助大不

问题描述 阅读android项目源代码对学习android开发帮助大不 阅读android项目源代码对学习android开发重不重要,做类似项目可以去抄袭吗 解决方案 建议你先系统学习.很多源代码虽然能实现功能,但是包含了一些不规范和不好的习惯. 网上流传的代码,不少是个人的习作,质量并不高. 你只能当作思路参考,而不是用来学习.

如何通过TensorFlow实现深度学习算法并运用到企业实践中

本文根据才云科技首席大数据科学家郑泽宇在QCon2016全球软件开发大会(上海站)上的演讲整理而成,希望大家可以了解如何通过TensorFlow实现深度学习算法,并将深度学习运用到企业实践中. 讲师介绍 郑泽宇,谷歌高级工程师.从 2013 年加入谷歌至今,郑泽宇作为主要技术人员参与并领导了多个大数据项目,拥有丰富机器学习.数据挖掘工业界及科研项目经验.2014 年,他提出产品聚类项目用于衔接谷歌购物和谷歌知识图谱(Knowledge Graph)数据,使得知识卡片形式的广告逐步取代传统的产品列

OpenAI 发布增强学习算法测试开源工具包

去年成立的非营利性人工智能研究机构OpenAI得到了包括Elon Musk在内的多个硅谷巨头的支持,因此在人工智能领域颇受瞩目(编者按:Musk是人工智能威胁论的支持者,投资OpenAI是为了随时掌握AI的发展动态). 近日OpenAI发布了成立来的第一个产品:增强学习算法的开源测试平台Gym(Beta版本). Gym可以在本地运行,用于在各种实验环境中测试增强学习算法,Gym也可以作为web服务用于分享测试结果.Gym能够自动给出评估分数,同时还支持用户查看和分享这些结果. 据OpenAI研究

新手学习seo必须将基础代码知识和seo基本思想结合起来

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 众所周知,目前随着电子商务的蓬勃发展,很多企业纷至沓来,加入到互联网的竞争之中,作为一个seo新人我们如何在残酷的竞争中求得一席之地,笔者今天以一个过来人的身份和大家分享下自己当初学习seo中的点点滴滴,其实本篇的主题笔者已经表述的非常明确了就是新手学习seo要将基础代码知识和seo基本思想结合起来,通过基本的seo策略和思路去指引我们的优化

还在费心学编程?微软用深度学习 AI 帮你写代码

在过去的几十年中,无论在硬件组织还是软件架构上,计算机行业已经发生了翻天覆地的变化,各种软硬件产品的性能和用户体验均得到了显著提升. 但对程序员而言,软件编码的本质似乎并没有什么本质的改变:无论哪种编程语言,仍然需要程序员根据算法逻辑和实现步骤一步一步地手动敲入代码.虽然近几年随着编码工具的改进和编程语言的版本更新,对于程序员而言,这一过程已经相当方便了,但学习如何编程仍然是诸多计算机用户不得不面对的一道难题. 雷锋网消息,近日,微软在论文中公布了一项最新的代码合成系统:RobustFill.它